Project Date
NLTEST 02 Nov 2020, 12:39

Tag Report

Steps Scenarios Features
Tag Passed Failed Skipped Pending Undefined Total Passed Failed Total Duration Status
@Test=downloadInspireValidation 1364 31 589 0 0 1984 0 31 31 5:1.673 Failed
10.852
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:39:06.284 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 4.959
12:39:06.285 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 253
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}

12:39:11.242 response time in milliseconds: 4224.91
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:39:10 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:39:09 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/08c3e16b-d63d-463e-9496-2bebb9069096.json","testRuns":{"TestRun":{"id":"EID08c3e16b-d63d-463e-9496-2bebb9069096","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:08.345Z","testTasks":{"TestTask":{"id":"EID9c969204-7955-4fe8-8ff9-182c8022c012","parent":{"ref":"EID08c3e16b-d63d-463e-9496-2bebb9069096"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDdf979cb1-1582-40a2-ae61-8fe61ce78b6b"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID08c3e16b-d63d-463e-9496-2bebb9069096/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDdf979cb1-1582-40a2-ae61-8fe61ce78b6b","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:39:06.712Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:08.091Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:39:11.245 [print] EID08c3e16b-d63d-463e-9496-2bebb9069096
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:11.245 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:11.246 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:11.246 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/08c3e16b-d63d-463e-9496-2bebb9069096.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:11.246 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID08c3e16b-d63d-463e-9496-2bebb9069096/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:39:11.246 [print] statuspath TestRuns/EID08c3e16b-d63d-463e-9496-2bebb9069096
* print 'progresspath ', progresspath 0.000
12:39:11.246 [print] progresspath  TestRuns/EID08c3e16b-d63d-463e-9496-2bebb9069096/progress
Given path progresspath 0.000
When method GET 2.008
12:39:11.247 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID08c3e16b-d63d-463e-9496-2bebb9069096/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:13.255 response time in milliseconds: 2007.31
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:39:13 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:39:13.255 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 2.007
12:39:13.255 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID08c3e16b-d63d-463e-9496-2bebb9069096/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:15.262 response time in milliseconds: 2006.59
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:39:15 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
* print response 0.000
12:39:15.263 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path statuspath 0.000
When method GET 1.866
12:39:15.263 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID08c3e16b-d63d-463e-9496-2bebb9069096
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:17.117 response time in milliseconds: 1419.91
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:39:16 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:39:10 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/08c3e16b-d63d-463e-9496-2bebb9069096.json","testRuns":{"TestRun":{"id":"EID08c3e16b-d63d-463e-9496-2bebb9069096","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:08.345Z","testTasks":{"TestTask":{"id":"EID9c969204-7955-4fe8-8ff9-182c8022c012","parent":{"ref":"EID08c3e16b-d63d-463e-9496-2bebb9069096"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDdf979cb1-1582-40a2-ae61-8fe61ce78b6b"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID08c3e16b-d63d-463e-9496-2bebb9069096/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDdf979cb1-1582-40a2-ae61-8fe61ce78b6b","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:39:06.712Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:08.091Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:39:17.130 [print] EID08c3e16b-d63d-463e-9496-2bebb9069096
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:17.130 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:39:17.130 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:17.130 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:17.130 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/08c3e16b-d63d-463e-9496-2bebb9069096.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:39:17.130 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/08c3e16b-d63d-463e-9496-2bebb9069096.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:17.131 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID08c3e16b-d63d-463e-9496-2bebb9069096/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.004
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.001
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
9.537
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.006
12:37:50.591 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 3.714
12:37:50.592 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 253
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}

12:37:54.292 response time in milliseconds: 2943.03
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:37:53 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:37:52 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/9f7b99c5-794e-4051-a1c2-835b3e5373c6.json","testRuns":{"TestRun":{"id":"EID9f7b99c5-794e-4051-a1c2-835b3e5373c6","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:37:52.384Z","testTasks":{"TestTask":{"id":"EID379e6960-a5fe-47e1-a6ac-23b3c936e2cd","parent":{"ref":"EID9f7b99c5-794e-4051-a1c2-835b3e5373c6"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID38ee2fea-58fd-434a-ae10-ef2e66869858"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID9f7b99c5-794e-4051-a1c2-835b3e5373c6/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID38ee2fea-58fd-434a-ae10-ef2e66869858","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:37:51.029Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:37:52.096Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:37:54.307 [print] EID9f7b99c5-794e-4051-a1c2-835b3e5373c6
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:37:54.308 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:37:54.308 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:37:54.309 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/9f7b99c5-794e-4051-a1c2-835b3e5373c6.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:37:54.309 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID9f7b99c5-794e-4051-a1c2-835b3e5373c6/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.003
12:37:54.313 [print] statuspath TestRuns/EID9f7b99c5-794e-4051-a1c2-835b3e5373c6
* print 'progresspath ', progresspath 0.000
12:37:54.313 [print] progresspath  TestRuns/EID9f7b99c5-794e-4051-a1c2-835b3e5373c6/progress
Given path progresspath 0.000
When method GET 2.032
12:37:54.315 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID9f7b99c5-794e-4051-a1c2-835b3e5373c6/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:37:56.346 response time in milliseconds: 2030.23
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:37:56 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:37:56.346 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 2.029
12:37:56.347 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID9f7b99c5-794e-4051-a1c2-835b3e5373c6/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:37:58.375 response time in milliseconds: 2026.86
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:37:58 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
* print response 0.000
12:37:58.375 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path statuspath 0.000
When method GET 1.704
12:37:58.377 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID9f7b99c5-794e-4051-a1c2-835b3e5373c6
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:00.072 response time in milliseconds: 1144.61
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:37:59 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:37:54 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/9f7b99c5-794e-4051-a1c2-835b3e5373c6.json","testRuns":{"TestRun":{"id":"EID9f7b99c5-794e-4051-a1c2-835b3e5373c6","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:37:52.384Z","testTasks":{"TestTask":{"id":"EID379e6960-a5fe-47e1-a6ac-23b3c936e2cd","parent":{"ref":"EID9f7b99c5-794e-4051-a1c2-835b3e5373c6"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID38ee2fea-58fd-434a-ae10-ef2e66869858"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID9f7b99c5-794e-4051-a1c2-835b3e5373c6/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID38ee2fea-58fd-434a-ae10-ef2e66869858","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:37:51.029Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:37:52.096Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:00.081 [print] EID9f7b99c5-794e-4051-a1c2-835b3e5373c6
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:00.082 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:00.083 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:00.084 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:00.084 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/9f7b99c5-794e-4051-a1c2-835b3e5373c6.json
* def ref = response.EtfItemCollection.ref 0.006
* print ref 0.000
12:38:00.090 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/9f7b99c5-794e-4051-a1c2-835b3e5373c6.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:00.091 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID9f7b99c5-794e-4051-a1c2-835b3e5373c6/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.026
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.004
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.001
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
7.963
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.005
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:37:57.928 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 3.728
12:37:57.930 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 253
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}

12:38:01.655 response time in milliseconds: 2943.14
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:00 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:00 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/5ff6b82d-50ff-42d8-9aac-93a03990e627.json","testRuns":{"TestRun":{"id":"EID5ff6b82d-50ff-42d8-9aac-93a03990e627","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:37:59.348Z","testTasks":{"TestTask":{"id":"EID6f7321fe-1133-4ffa-9bbb-47a9a8646547","parent":{"ref":"EID5ff6b82d-50ff-42d8-9aac-93a03990e627"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID18f3a6e9-e3f5-4d73-a544-4de57290cdee"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID5ff6b82d-50ff-42d8-9aac-93a03990e627/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID18f3a6e9-e3f5-4d73-a544-4de57290cdee","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:37:58.373Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:37:59.048Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:01.658 [print] EID5ff6b82d-50ff-42d8-9aac-93a03990e627
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:01.659 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:01.659 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:01.659 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/5ff6b82d-50ff-42d8-9aac-93a03990e627.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:01.660 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID5ff6b82d-50ff-42d8-9aac-93a03990e627/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:38:01.660 [print] statuspath TestRuns/EID5ff6b82d-50ff-42d8-9aac-93a03990e627
* print 'progresspath ', progresspath 0.000
12:38:01.660 [print] progresspath  TestRuns/EID5ff6b82d-50ff-42d8-9aac-93a03990e627/progress
Given path progresspath 0.032
When method GET 2.036
12:38:01.695 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID5ff6b82d-50ff-42d8-9aac-93a03990e627/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:03.729 response time in milliseconds: 2016.70
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:38:03 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:38:03.729 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 0.508
12:38:03.730 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID5ff6b82d-50ff-42d8-9aac-93a03990e627/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:04.237 response time in milliseconds: 506.86
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:38:04 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:38:04.238 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 1.627
12:38:04.239 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID5ff6b82d-50ff-42d8-9aac-93a03990e627
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:05.861 response time in milliseconds: 1171.01
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:38:05 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:02 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/5ff6b82d-50ff-42d8-9aac-93a03990e627.json","testRuns":{"TestRun":{"id":"EID5ff6b82d-50ff-42d8-9aac-93a03990e627","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:37:59.348Z","testTasks":{"TestTask":{"id":"EID6f7321fe-1133-4ffa-9bbb-47a9a8646547","parent":{"ref":"EID5ff6b82d-50ff-42d8-9aac-93a03990e627"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID18f3a6e9-e3f5-4d73-a544-4de57290cdee"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID5ff6b82d-50ff-42d8-9aac-93a03990e627/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID18f3a6e9-e3f5-4d73-a544-4de57290cdee","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:37:58.373Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:37:59.048Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.004
12:38:05.870 [print] EID5ff6b82d-50ff-42d8-9aac-93a03990e627
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:05.870 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:05.870 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:05.871 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:05.871 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/5ff6b82d-50ff-42d8-9aac-93a03990e627.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:38:05.871 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/5ff6b82d-50ff-42d8-9aac-93a03990e627.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:05.871 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID5ff6b82d-50ff-42d8-9aac-93a03990e627/log
* def embedUrl = 0.009
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.003
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.001
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
8.983
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:39:18.431 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rvo/inspire/invasieve-exoten/atom/v1_0/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 4.839
12:39:18.432 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 287
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rvo/inspire/invasieve-exoten/atom/v1_0/index.xml"}}}

12:39:23.269 response time in milliseconds: 4095.84
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:39:22 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:39:20 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/9d84ccf5-8450-40b2-8d64-fbd5a64d727b.json","testRuns":{"TestRun":{"id":"EID9d84ccf5-8450-40b2-8d64-fbd5a64d727b","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:20.176Z","testTasks":{"TestTask":{"id":"EID35c7e97c-8034-4ac7-ae69-6763e7664b57","parent":{"ref":"EID9d84ccf5-8450-40b2-8d64-fbd5a64d727b"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID21b6be52-d934-48d4-be82-553148594d92"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID9d84ccf5-8450-40b2-8d64-fbd5a64d727b/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID21b6be52-d934-48d4-be82-553148594d92","remoteResource":"https://geodata.nationaalgeoregister.nl/rvo/inspire/invasieve-exoten/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:39:18.858Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:19.785Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rvo/inspire/invasieve-exoten/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:39:23.272 [print] EID9d84ccf5-8450-40b2-8d64-fbd5a64d727b
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:23.272 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:23.272 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:23.273 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/9d84ccf5-8450-40b2-8d64-fbd5a64d727b.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:23.273 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID9d84ccf5-8450-40b2-8d64-fbd5a64d727b/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.001
12:39:23.274 [print] statuspath TestRuns/EID9d84ccf5-8450-40b2-8d64-fbd5a64d727b
* print 'progresspath ', progresspath 0.000
12:39:23.275 [print] progresspath  TestRuns/EID9d84ccf5-8450-40b2-8d64-fbd5a64d727b/progress
Given path progresspath 0.000
When method GET 2.025
12:39:23.280 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID9d84ccf5-8450-40b2-8d64-fbd5a64d727b/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:25.301 response time in milliseconds: 2019.91
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:39:25 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:39:25.301 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 0.520
12:39:25.302 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID9d84ccf5-8450-40b2-8d64-fbd5a64d727b/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:25.821 response time in milliseconds: 519.04
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:39:25 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:39:25.821 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 1.587
12:39:25.822 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID9d84ccf5-8450-40b2-8d64-fbd5a64d727b
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:27.406 response time in milliseconds: 1163.13
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:39:26 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:39:25 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/9d84ccf5-8450-40b2-8d64-fbd5a64d727b.json","testRuns":{"TestRun":{"id":"EID9d84ccf5-8450-40b2-8d64-fbd5a64d727b","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:20.176Z","testTasks":{"TestTask":{"id":"EID35c7e97c-8034-4ac7-ae69-6763e7664b57","parent":{"ref":"EID9d84ccf5-8450-40b2-8d64-fbd5a64d727b"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID21b6be52-d934-48d4-be82-553148594d92"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID9d84ccf5-8450-40b2-8d64-fbd5a64d727b/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID21b6be52-d934-48d4-be82-553148594d92","remoteResource":"https://geodata.nationaalgeoregister.nl/rvo/inspire/invasieve-exoten/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:39:18.858Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:19.785Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rvo/inspire/invasieve-exoten/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.001
12:39:27.410 [print] EID9d84ccf5-8450-40b2-8d64-fbd5a64d727b
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:27.410 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:39:27.411 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:27.411 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:27.411 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/9d84ccf5-8450-40b2-8d64-fbd5a64d727b.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:39:27.412 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/9d84ccf5-8450-40b2-8d64-fbd5a64d727b.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:27.412 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID9d84ccf5-8450-40b2-8d64-fbd5a64d727b/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.002
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
10.190
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:38:16.229 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2015/atom/v1_0/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 4.314
12:38:16.237 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 286
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2015/atom/v1_0/index.xml"}}}

12:38:20.541 response time in milliseconds: 3522.49
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:19 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:18 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/e7255d7e-2056-4ec8-aca7-d8fcdf91fc43.json","testRuns":{"TestRun":{"id":"EIDe7255d7e-2056-4ec8-aca7-d8fcdf91fc43","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:18.178Z","testTasks":{"TestTask":{"id":"EIDde25e025-7ed8-42d5-b244-233b12309687","parent":{"ref":"EIDe7255d7e-2056-4ec8-aca7-d8fcdf91fc43"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDa21e4ab0-6572-4d5a-953a-e70efd9bdf22"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EIDe7255d7e-2056-4ec8-aca7-d8fcdf91fc43/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDa21e4ab0-6572-4d5a-953a-e70efd9bdf22","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2015/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:16.675Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:17.683Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2015/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.020
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:20.565 [print] EIDe7255d7e-2056-4ec8-aca7-d8fcdf91fc43
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:20.565 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:20.565 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:20.565 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/e7255d7e-2056-4ec8-aca7-d8fcdf91fc43.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:20.565 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EIDe7255d7e-2056-4ec8-aca7-d8fcdf91fc43/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:38:20.566 [print] statuspath TestRuns/EIDe7255d7e-2056-4ec8-aca7-d8fcdf91fc43
* print 'progresspath ', progresspath 0.000
12:38:20.566 [print] progresspath  TestRuns/EIDe7255d7e-2056-4ec8-aca7-d8fcdf91fc43/progress
Given path progresspath 0.000
When method GET 2.020
12:38:20.567 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EIDe7255d7e-2056-4ec8-aca7-d8fcdf91fc43/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:22.587 response time in milliseconds: 2019.72
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:38:22 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:38:22.587 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 2.034
12:38:22.588 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EIDe7255d7e-2056-4ec8-aca7-d8fcdf91fc43/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:24.622 response time in milliseconds: 2033.01
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:38:24 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
* print response 0.000
12:38:24.622 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path statuspath 0.000
When method GET 1.781
12:38:24.623 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EIDe7255d7e-2056-4ec8-aca7-d8fcdf91fc43
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:26.401 response time in milliseconds: 1311.46
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:38:25 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:21 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/e7255d7e-2056-4ec8-aca7-d8fcdf91fc43.json","testRuns":{"TestRun":{"id":"EIDe7255d7e-2056-4ec8-aca7-d8fcdf91fc43","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:18.178Z","testTasks":{"TestTask":{"id":"EIDde25e025-7ed8-42d5-b244-233b12309687","parent":{"ref":"EIDe7255d7e-2056-4ec8-aca7-d8fcdf91fc43"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDa21e4ab0-6572-4d5a-953a-e70efd9bdf22"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EIDe7255d7e-2056-4ec8-aca7-d8fcdf91fc43/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDa21e4ab0-6572-4d5a-953a-e70efd9bdf22","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2015/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:16.675Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:17.683Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2015/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.004
12:38:26.409 [print] EIDe7255d7e-2056-4ec8-aca7-d8fcdf91fc43
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:26.409 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:26.409 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:26.409 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:26.409 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/e7255d7e-2056-4ec8-aca7-d8fcdf91fc43.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:38:26.409 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/e7255d7e-2056-4ec8-aca7-d8fcdf91fc43.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:26.410 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EIDe7255d7e-2056-4ec8-aca7-d8fcdf91fc43/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.007
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
7.689
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:38:31.159 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 5.063
12:38:31.160 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 253
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}

12:38:36.215 response time in milliseconds: 4309.43
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:35 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:33 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/88d5559c-75e1-4251-9c57-e6ed5952b506.json","testRuns":{"TestRun":{"id":"EID88d5559c-75e1-4251-9c57-e6ed5952b506","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:32.725Z","testTasks":{"TestTask":{"id":"EIDbe881be9-bece-4d4f-a42c-2bf86fbd76bb","parent":{"ref":"EID88d5559c-75e1-4251-9c57-e6ed5952b506"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID03988b50-ba9a-4a6b-8f36-133f6fd844f7"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID88d5559c-75e1-4251-9c57-e6ed5952b506/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID03988b50-ba9a-4a6b-8f36-133f6fd844f7","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:31.59Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:32.271Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.002
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:36.226 [print] EID88d5559c-75e1-4251-9c57-e6ed5952b506
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:36.226 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:36.226 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.010
12:38:36.237 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/88d5559c-75e1-4251-9c57-e6ed5952b506.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:36.237 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID88d5559c-75e1-4251-9c57-e6ed5952b506/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:38:36.237 [print] statuspath TestRuns/EID88d5559c-75e1-4251-9c57-e6ed5952b506
* print 'progresspath ', progresspath 0.000
12:38:36.238 [print] progresspath  TestRuns/EID88d5559c-75e1-4251-9c57-e6ed5952b506/progress
Given path progresspath 0.000
When method GET 0.519
12:38:36.241 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID88d5559c-75e1-4251-9c57-e6ed5952b506/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:36.758 response time in milliseconds: 516.49
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:38:36 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
And retry until response.val == response.max 0.000
* print response 0.000
12:38:36.758 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path progresspath 0.000
When method GET 0.507
12:38:36.759 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID88d5559c-75e1-4251-9c57-e6ed5952b506/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:37.265 response time in milliseconds: 506.08
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:38:37 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:38:37.266 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 1.560
12:38:37.267 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID88d5559c-75e1-4251-9c57-e6ed5952b506
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:38.824 response time in milliseconds: 1140.34
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:38:38 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:36 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/88d5559c-75e1-4251-9c57-e6ed5952b506.json","testRuns":{"TestRun":{"id":"EID88d5559c-75e1-4251-9c57-e6ed5952b506","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:32.725Z","testTasks":{"TestTask":{"id":"EIDbe881be9-bece-4d4f-a42c-2bf86fbd76bb","parent":{"ref":"EID88d5559c-75e1-4251-9c57-e6ed5952b506"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID03988b50-ba9a-4a6b-8f36-133f6fd844f7"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID88d5559c-75e1-4251-9c57-e6ed5952b506/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID03988b50-ba9a-4a6b-8f36-133f6fd844f7","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:31.59Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:32.271Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:38.827 [print] EID88d5559c-75e1-4251-9c57-e6ed5952b506
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:38.827 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:38.827 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:38.828 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.013
12:38:38.841 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/88d5559c-75e1-4251-9c57-e6ed5952b506.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:38:38.841 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/88d5559c-75e1-4251-9c57-e6ed5952b506.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:38.841 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID88d5559c-75e1-4251-9c57-e6ed5952b506/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.002
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.004
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
9.297
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:37:49.643 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 3.624
12:37:49.659 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 253
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}

12:37:53.258 response time in milliseconds: 2845.77
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:37:52 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:37:51 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/11fb30e9-795e-4ec2-922e-09f72952e981.json","testRuns":{"TestRun":{"id":"EID11fb30e9-795e-4ec2-922e-09f72952e981","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:37:51.262Z","testTasks":{"TestTask":{"id":"EID20676ed2-660b-4463-8232-836afb4150d0","parent":{"ref":"EID11fb30e9-795e-4ec2-922e-09f72952e981"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID2b3f55bf-edc6-4a59-b60d-e0a0dadbd1a6"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID11fb30e9-795e-4ec2-922e-09f72952e981/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID2b3f55bf-edc6-4a59-b60d-e0a0dadbd1a6","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:37:50.099Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:37:50.882Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:37:53.270 [print] EID11fb30e9-795e-4ec2-922e-09f72952e981
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:37:53.270 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:37:53.271 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:37:53.271 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/11fb30e9-795e-4ec2-922e-09f72952e981.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:37:53.271 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID11fb30e9-795e-4ec2-922e-09f72952e981/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:37:53.272 [print] statuspath TestRuns/EID11fb30e9-795e-4ec2-922e-09f72952e981
* print 'progresspath ', progresspath 0.000
12:37:53.273 [print] progresspath  TestRuns/EID11fb30e9-795e-4ec2-922e-09f72952e981/progress
Given path progresspath 0.000
When method GET 2.029
12:37:53.274 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID11fb30e9-795e-4ec2-922e-09f72952e981/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:37:55.302 response time in milliseconds: 2027.32
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:37:55 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:37:55.302 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 2.033
12:37:55.312 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID11fb30e9-795e-4ec2-922e-09f72952e981/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:37:57.334 response time in milliseconds: 2021.34
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:37:57 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
* print response 0.001
12:37:57.337 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path statuspath 0.000
When method GET 1.573
12:37:57.338 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID11fb30e9-795e-4ec2-922e-09f72952e981
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:37:58.897 response time in milliseconds: 1125.17
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:37:58 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:37:54 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/11fb30e9-795e-4ec2-922e-09f72952e981.json","testRuns":{"TestRun":{"id":"EID11fb30e9-795e-4ec2-922e-09f72952e981","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:37:51.262Z","testTasks":{"TestTask":{"id":"EID20676ed2-660b-4463-8232-836afb4150d0","parent":{"ref":"EID11fb30e9-795e-4ec2-922e-09f72952e981"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID2b3f55bf-edc6-4a59-b60d-e0a0dadbd1a6"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID11fb30e9-795e-4ec2-922e-09f72952e981/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID2b3f55bf-edc6-4a59-b60d-e0a0dadbd1a6","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:37:50.099Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:37:50.882Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.002
12:37:58.913 [print] EID11fb30e9-795e-4ec2-922e-09f72952e981
* print response.EtfItemCollection.testRuns.TestRun.status 0.001
12:37:58.914 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:37:58.915 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:37:58.916 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:37:58.917 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/11fb30e9-795e-4ec2-922e-09f72952e981.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:37:58.918 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/11fb30e9-795e-4ec2-922e-09f72952e981.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:37:58.919 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID11fb30e9-795e-4ec2-922e-09f72952e981/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.002
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.003
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.013
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.002
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
14.138
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:38:51.122 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 5.941
12:38:51.123 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 253
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}

12:38:57.061 response time in milliseconds: 5165.70
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:56 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:53 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/121e7ad3-46c2-441f-9c9f-9415e1108886.json","testRuns":{"TestRun":{"id":"EID121e7ad3-46c2-441f-9c9f-9415e1108886","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:52.884Z","testTasks":{"TestTask":{"id":"EIDf412947b-4aae-437c-b707-070de8a3b40b","parent":{"ref":"EID121e7ad3-46c2-441f-9c9f-9415e1108886"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID4994acfe-580f-4530-85c5-b615468a1915"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID121e7ad3-46c2-441f-9c9f-9415e1108886/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID4994acfe-580f-4530-85c5-b615468a1915","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:51.549Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:52.352Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.006
12:38:57.070 [print] EID121e7ad3-46c2-441f-9c9f-9415e1108886
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:57.070 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:57.071 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:57.071 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/121e7ad3-46c2-441f-9c9f-9415e1108886.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:57.071 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID121e7ad3-46c2-441f-9c9f-9415e1108886/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:38:57.072 [print] statuspath TestRuns/EID121e7ad3-46c2-441f-9c9f-9415e1108886
* print 'progresspath ', progresspath 0.000
12:38:57.073 [print] progresspath  TestRuns/EID121e7ad3-46c2-441f-9c9f-9415e1108886/progress
Given path progresspath 0.000
When method GET 2.020
12:38:57.075 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID121e7ad3-46c2-441f-9c9f-9415e1108886/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:59.093 response time in milliseconds: 2018.28
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:38:59 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:38:59.094 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 2.025
12:38:59.094 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID121e7ad3-46c2-441f-9c9f-9415e1108886/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:01.119 response time in milliseconds: 2024.28
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:39:01 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
* print response 0.000
12:39:01.119 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path statuspath 0.000
When method GET 4.127
12:39:01.120 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID121e7ad3-46c2-441f-9c9f-9415e1108886
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:05.245 response time in milliseconds: 3380.93
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:39:04 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:56 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/121e7ad3-46c2-441f-9c9f-9415e1108886.json","testRuns":{"TestRun":{"id":"EID121e7ad3-46c2-441f-9c9f-9415e1108886","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:52.884Z","testTasks":{"TestTask":{"id":"EIDf412947b-4aae-437c-b707-070de8a3b40b","parent":{"ref":"EID121e7ad3-46c2-441f-9c9f-9415e1108886"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID4994acfe-580f-4530-85c5-b615468a1915"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID121e7ad3-46c2-441f-9c9f-9415e1108886/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID4994acfe-580f-4530-85c5-b615468a1915","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:51.549Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:52.352Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:39:05.247 [print] EID121e7ad3-46c2-441f-9c9f-9415e1108886
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:05.248 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:39:05.249 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:05.249 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:05.250 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/121e7ad3-46c2-441f-9c9f-9415e1108886.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:39:05.250 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/121e7ad3-46c2-441f-9c9f-9415e1108886.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:05.250 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID121e7ad3-46c2-441f-9c9f-9415e1108886/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.006
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.002
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
11.329
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:39:31.558 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwateractueel/atom/v1_0/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 5.594
12:39:31.560 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 289
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwateractueel/atom/v1_0/index.xml"}}}

12:39:37.150 response time in milliseconds: 4843.17
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:39:36 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:39:34 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438.json","testRuns":{"TestRun":{"id":"EID0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:33.588Z","testTasks":{"TestTask":{"id":"EID98c10f80-0cf2-42ec-8056-71d41e72f354","parent":{"ref":"EID0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDa23f503e-1ce9-4d28-a185-a8660aa94a64"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDa23f503e-1ce9-4d28-a185-a8660aa94a64","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwateractueel/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:39:31.99Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:33.299Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwateractueel/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.001
12:39:37.154 [print] EID0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:37.154 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:37.154 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:37.154 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:37.155 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:39:37.157 [print] statuspath TestRuns/EID0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438
* print 'progresspath ', progresspath 0.000
12:39:37.157 [print] progresspath  TestRuns/EID0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438/progress
Given path progresspath 0.000
When method GET 2.030
12:39:37.158 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:39.187 response time in milliseconds: 2029.01
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:39:39 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:39:39.188 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 2.034
12:39:39.188 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:41.222 response time in milliseconds: 2033.34
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:39:41 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
* print response 0.000
12:39:41.222 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path statuspath 0.000
When method GET 1.662
12:39:41.223 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:42.882 response time in milliseconds: 1124.58
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:39:42 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:39:34 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438.json","testRuns":{"TestRun":{"id":"EID0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:33.588Z","testTasks":{"TestTask":{"id":"EID98c10f80-0cf2-42ec-8056-71d41e72f354","parent":{"ref":"EID0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDa23f503e-1ce9-4d28-a185-a8660aa94a64"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDa23f503e-1ce9-4d28-a185-a8660aa94a64","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwateractueel/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:39:31.99Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:33.299Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwateractueel/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:39:42.885 [print] EID0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:42.885 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:39:42.885 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:42.886 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:42.886 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:39:42.886 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:42.886 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID0d4ac1e2-4e7e-4a10-b2b8-a0f09cd90438/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.002
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
9.296
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:38:40.149 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 3.452
12:38:40.149 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 253
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}

12:38:43.589 response time in milliseconds: 2695.05
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:42 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:42 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/0500f14f-0d76-455d-97b1-085c1b082610.json","testRuns":{"TestRun":{"id":"EID0500f14f-0d76-455d-97b1-085c1b082610","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:41.743Z","testTasks":{"TestTask":{"id":"EID258583df-1c7c-4045-aefc-e304cacf95f3","parent":{"ref":"EID0500f14f-0d76-455d-97b1-085c1b082610"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID64edd951-e7ce-4e36-bb77-cec8d5981976"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID0500f14f-0d76-455d-97b1-085c1b082610/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID64edd951-e7ce-4e36-bb77-cec8d5981976","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:40.582Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:41.288Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:43.602 [print] EID0500f14f-0d76-455d-97b1-085c1b082610
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:43.602 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:43.602 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:43.602 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/0500f14f-0d76-455d-97b1-085c1b082610.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:43.602 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID0500f14f-0d76-455d-97b1-085c1b082610/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:38:43.603 [print] statuspath TestRuns/EID0500f14f-0d76-455d-97b1-085c1b082610
* print 'progresspath ', progresspath 0.000
12:38:43.603 [print] progresspath  TestRuns/EID0500f14f-0d76-455d-97b1-085c1b082610/progress
Given path progresspath 0.000
When method GET 2.024
12:38:43.604 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID0500f14f-0d76-455d-97b1-085c1b082610/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:45.628 response time in milliseconds: 2023.22
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:38:45 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:38:45.628 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 2.028
12:38:45.628 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID0500f14f-0d76-455d-97b1-085c1b082610/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:47.656 response time in milliseconds: 2026.72
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:38:47 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
* print response 0.000
12:38:47.656 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path statuspath 0.000
When method GET 1.775
12:38:47.657 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID0500f14f-0d76-455d-97b1-085c1b082610
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:49.429 response time in milliseconds: 1227.47
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:38:48 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:42 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/0500f14f-0d76-455d-97b1-085c1b082610.json","testRuns":{"TestRun":{"id":"EID0500f14f-0d76-455d-97b1-085c1b082610","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:41.743Z","testTasks":{"TestTask":{"id":"EID258583df-1c7c-4045-aefc-e304cacf95f3","parent":{"ref":"EID0500f14f-0d76-455d-97b1-085c1b082610"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID64edd951-e7ce-4e36-bb77-cec8d5981976"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID0500f14f-0d76-455d-97b1-085c1b082610/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID64edd951-e7ce-4e36-bb77-cec8d5981976","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:40.582Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:41.288Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:49.432 [print] EID0500f14f-0d76-455d-97b1-085c1b082610
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:49.432 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:49.432 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:49.432 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:49.433 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/0500f14f-0d76-455d-97b1-085c1b082610.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:38:49.433 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/0500f14f-0d76-455d-97b1-085c1b082610.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:49.433 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID0500f14f-0d76-455d-97b1-085c1b082610/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.002
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.009
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
8.585
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:39:23.833 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 3.464
12:39:23.834 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 253
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}

12:39:27.290 response time in milliseconds: 2707.97
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:39:26 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:39:25 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/712c619c-a128-45f6-ab94-8391efc5da36.json","testRuns":{"TestRun":{"id":"EID712c619c-a128-45f6-ab94-8391efc5da36","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:25.37Z","testTasks":{"TestTask":{"id":"EIDd3ee770b-b366-4b92-8c33-14d0c725bf80","parent":{"ref":"EID712c619c-a128-45f6-ab94-8391efc5da36"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDf79a218a-dbca-4075-a889-1c2238a4dc46"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID712c619c-a128-45f6-ab94-8391efc5da36/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDf79a218a-dbca-4075-a889-1c2238a4dc46","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:39:24.27Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:25.086Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.010
12:39:27.309 [print] EID712c619c-a128-45f6-ab94-8391efc5da36
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:27.309 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:27.309 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:27.310 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/712c619c-a128-45f6-ab94-8391efc5da36.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:27.310 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID712c619c-a128-45f6-ab94-8391efc5da36/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:39:27.310 [print] statuspath TestRuns/EID712c619c-a128-45f6-ab94-8391efc5da36
* print 'progresspath ', progresspath 0.000
12:39:27.310 [print] progresspath  TestRuns/EID712c619c-a128-45f6-ab94-8391efc5da36/progress
Given path progresspath 0.000
When method GET 0.527
12:39:27.311 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID712c619c-a128-45f6-ab94-8391efc5da36/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:27.837 response time in milliseconds: 526.05
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:39:27 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
And retry until response.val == response.max 0.000
* print response 0.000
12:39:27.838 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path progresspath 0.000
When method GET 0.551
12:39:27.838 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID712c619c-a128-45f6-ab94-8391efc5da36/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:28.389 response time in milliseconds: 550.24
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:39:28 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:39:28.389 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 4.009
12:39:28.389 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID712c619c-a128-45f6-ab94-8391efc5da36
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:32.396 response time in milliseconds: 3254.40
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:39:31 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:39:25 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/712c619c-a128-45f6-ab94-8391efc5da36.json","testRuns":{"TestRun":{"id":"EID712c619c-a128-45f6-ab94-8391efc5da36","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:25.37Z","testTasks":{"TestTask":{"id":"EIDd3ee770b-b366-4b92-8c33-14d0c725bf80","parent":{"ref":"EID712c619c-a128-45f6-ab94-8391efc5da36"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDf79a218a-dbca-4075-a889-1c2238a4dc46"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID712c619c-a128-45f6-ab94-8391efc5da36/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDf79a218a-dbca-4075-a889-1c2238a4dc46","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:39:24.27Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:25.086Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.008
12:39:32.407 [print] EID712c619c-a128-45f6-ab94-8391efc5da36
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:32.407 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:39:32.408 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:32.408 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:32.408 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/712c619c-a128-45f6-ab94-8391efc5da36.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:39:32.409 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/712c619c-a128-45f6-ab94-8391efc5da36.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:32.409 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID712c619c-a128-45f6-ab94-8391efc5da36/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.002
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.007
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
12.486
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:39:20.305 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2009/atom/v1_0/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 4.056
12:39:20.305 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 286
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2009/atom/v1_0/index.xml"}}}

12:39:24.360 response time in milliseconds: 3327.18
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:39:23 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:39:22 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/0e47a1b5-a0eb-411c-b044-97d6db69e0ea.json","testRuns":{"TestRun":{"id":"EID0e47a1b5-a0eb-411c-b044-97d6db69e0ea","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:22.469Z","testTasks":{"TestTask":{"id":"EID01faef16-ac34-4235-9e58-d2dbcc2bf4b1","parent":{"ref":"EID0e47a1b5-a0eb-411c-b044-97d6db69e0ea"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDaaefa382-4a54-40bb-ba71-0b96fac3a6f9"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID0e47a1b5-a0eb-411c-b044-97d6db69e0ea/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDaaefa382-4a54-40bb-ba71-0b96fac3a6f9","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2009/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:39:20.742Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:21.292Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2009/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:39:24.362 [print] EID0e47a1b5-a0eb-411c-b044-97d6db69e0ea
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:24.362 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:24.363 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:24.363 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/0e47a1b5-a0eb-411c-b044-97d6db69e0ea.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:24.363 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID0e47a1b5-a0eb-411c-b044-97d6db69e0ea/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:39:24.363 [print] statuspath TestRuns/EID0e47a1b5-a0eb-411c-b044-97d6db69e0ea
* print 'progresspath ', progresspath 0.000
12:39:24.363 [print] progresspath  TestRuns/EID0e47a1b5-a0eb-411c-b044-97d6db69e0ea/progress
Given path progresspath 0.000
When method GET 2.002
12:39:24.364 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID0e47a1b5-a0eb-411c-b044-97d6db69e0ea/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:26.366 response time in milliseconds: 2001.46
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:39:26 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:39:26.366 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 2.022
12:39:26.366 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID0e47a1b5-a0eb-411c-b044-97d6db69e0ea/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:28.388 response time in milliseconds: 2021.43
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:39:28 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
* print response 0.000
12:39:28.393 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path statuspath 0.000
When method GET 4.391
12:39:28.393 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID0e47a1b5-a0eb-411c-b044-97d6db69e0ea
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:32.782 response time in milliseconds: 3619.10
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:39:31 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:39:25 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/0e47a1b5-a0eb-411c-b044-97d6db69e0ea.json","testRuns":{"TestRun":{"id":"EID0e47a1b5-a0eb-411c-b044-97d6db69e0ea","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:22.469Z","testTasks":{"TestTask":{"id":"EID01faef16-ac34-4235-9e58-d2dbcc2bf4b1","parent":{"ref":"EID0e47a1b5-a0eb-411c-b044-97d6db69e0ea"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDaaefa382-4a54-40bb-ba71-0b96fac3a6f9"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID0e47a1b5-a0eb-411c-b044-97d6db69e0ea/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDaaefa382-4a54-40bb-ba71-0b96fac3a6f9","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2009/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:39:20.742Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:21.292Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2009/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:39:32.784 [print] EID0e47a1b5-a0eb-411c-b044-97d6db69e0ea
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:32.785 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:39:32.785 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:32.785 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:32.785 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/0e47a1b5-a0eb-411c-b044-97d6db69e0ea.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.007
12:39:32.793 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/0e47a1b5-a0eb-411c-b044-97d6db69e0ea.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:32.793 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID0e47a1b5-a0eb-411c-b044-97d6db69e0ea/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.002
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
10.369
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.002
12:38:25.881 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 4.197
12:38:25.882 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 253
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}

12:38:30.075 response time in milliseconds: 3462.02
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:29 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:28 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/ec8da7d7-4224-434d-bbc6-0e8624ec4ec3.json","testRuns":{"TestRun":{"id":"EIDec8da7d7-4224-434d-bbc6-0e8624ec4ec3","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:28.263Z","testTasks":{"TestTask":{"id":"EID17ab693a-e848-4985-a7d9-29cfe8a1b3e6","parent":{"ref":"EIDec8da7d7-4224-434d-bbc6-0e8624ec4ec3"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDf535ed19-3959-4fea-b430-9b02160f76b3"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EIDec8da7d7-4224-434d-bbc6-0e8624ec4ec3/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDf535ed19-3959-4fea-b430-9b02160f76b3","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:26.31Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:27.072Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:30.079 [print] EIDec8da7d7-4224-434d-bbc6-0e8624ec4ec3
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:30.079 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:30.079 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:30.079 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/ec8da7d7-4224-434d-bbc6-0e8624ec4ec3.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:30.079 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EIDec8da7d7-4224-434d-bbc6-0e8624ec4ec3/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:38:30.080 [print] statuspath TestRuns/EIDec8da7d7-4224-434d-bbc6-0e8624ec4ec3
* print 'progresspath ', progresspath 0.000
12:38:30.080 [print] progresspath  TestRuns/EIDec8da7d7-4224-434d-bbc6-0e8624ec4ec3/progress
Given path progresspath 0.000
When method GET 2.037
12:38:30.081 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EIDec8da7d7-4224-434d-bbc6-0e8624ec4ec3/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:32.117 response time in milliseconds: 2035.41
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:38:32 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:38:32.118 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 0.534
12:38:32.118 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EIDec8da7d7-4224-434d-bbc6-0e8624ec4ec3/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:32.652 response time in milliseconds: 533.13
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:38:32 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:38:32.653 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.001
When method GET 3.577
12:38:32.655 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EIDec8da7d7-4224-434d-bbc6-0e8624ec4ec3
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:36.222 response time in milliseconds: 2815.07
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:38:35 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:33 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/ec8da7d7-4224-434d-bbc6-0e8624ec4ec3.json","testRuns":{"TestRun":{"id":"EIDec8da7d7-4224-434d-bbc6-0e8624ec4ec3","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:28.263Z","testTasks":{"TestTask":{"id":"EID17ab693a-e848-4985-a7d9-29cfe8a1b3e6","parent":{"ref":"EIDec8da7d7-4224-434d-bbc6-0e8624ec4ec3"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDf535ed19-3959-4fea-b430-9b02160f76b3"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EIDec8da7d7-4224-434d-bbc6-0e8624ec4ec3/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDf535ed19-3959-4fea-b430-9b02160f76b3","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:26.31Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:27.072Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.006
12:38:36.239 [print] EIDec8da7d7-4224-434d-bbc6-0e8624ec4ec3
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:36.239 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:36.239 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:36.239 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:36.239 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/ec8da7d7-4224-434d-bbc6-0e8624ec4ec3.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:38:36.239 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/ec8da7d7-4224-434d-bbc6-0e8624ec4ec3.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:36.240 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EIDec8da7d7-4224-434d-bbc6-0e8624ec4ec3/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.003
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.003
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
10.731
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:38:46.438 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 4.018
12:38:46.439 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 253
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}

12:38:50.454 response time in milliseconds: 3277.22
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:49 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:48 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/416a553f-648e-409e-8db1-0c4d00a5bf48.json","testRuns":{"TestRun":{"id":"EID416a553f-648e-409e-8db1-0c4d00a5bf48","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:48.073Z","testTasks":{"TestTask":{"id":"EID34d09245-7a5d-4b7e-b404-f897f708b4ac","parent":{"ref":"EID416a553f-648e-409e-8db1-0c4d00a5bf48"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID68994304-905a-461d-88c0-c79666174cb9"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID416a553f-648e-409e-8db1-0c4d00a5bf48/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID68994304-905a-461d-88c0-c79666174cb9","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:46.88Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:47.684Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.001
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:50.458 [print] EID416a553f-648e-409e-8db1-0c4d00a5bf48
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:50.458 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:50.458 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:50.459 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/416a553f-648e-409e-8db1-0c4d00a5bf48.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:50.459 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID416a553f-648e-409e-8db1-0c4d00a5bf48/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.006
12:38:50.465 [print] statuspath TestRuns/EID416a553f-648e-409e-8db1-0c4d00a5bf48
* print 'progresspath ', progresspath 0.000
12:38:50.465 [print] progresspath  TestRuns/EID416a553f-648e-409e-8db1-0c4d00a5bf48/progress
Given path progresspath 0.000
When method GET 2.025
12:38:50.466 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID416a553f-648e-409e-8db1-0c4d00a5bf48/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:52.491 response time in milliseconds: 2024.59
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:38:52 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:38:52.491 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 0.521
12:38:52.492 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID416a553f-648e-409e-8db1-0c4d00a5bf48/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:53.012 response time in milliseconds: 520.01
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:38:52 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:38:53.013 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 4.138
12:38:53.015 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID416a553f-648e-409e-8db1-0c4d00a5bf48
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:57.149 response time in milliseconds: 3287.64
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:38:56 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:52 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/416a553f-648e-409e-8db1-0c4d00a5bf48.json","testRuns":{"TestRun":{"id":"EID416a553f-648e-409e-8db1-0c4d00a5bf48","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:48.073Z","testTasks":{"TestTask":{"id":"EID34d09245-7a5d-4b7e-b404-f897f708b4ac","parent":{"ref":"EID416a553f-648e-409e-8db1-0c4d00a5bf48"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID68994304-905a-461d-88c0-c79666174cb9"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID416a553f-648e-409e-8db1-0c4d00a5bf48/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID68994304-905a-461d-88c0-c79666174cb9","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:46.88Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:47.684Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.004
12:38:57.156 [print] EID416a553f-648e-409e-8db1-0c4d00a5bf48
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:57.157 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:57.157 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:57.158 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:57.158 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/416a553f-648e-409e-8db1-0c4d00a5bf48.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:38:57.159 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/416a553f-648e-409e-8db1-0c4d00a5bf48.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:57.159 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID416a553f-648e-409e-8db1-0c4d00a5bf48/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.010
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
10.556
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.049
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.004
* print testRunRequest 0.001
12:37:34.883 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rvo/inspire/invasieve-exoten/atom/v1_0/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.002
And request inspireload 0.000
When method post 4.445
12:37:34.962 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 287
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rvo/inspire/invasieve-exoten/atom/v1_0/index.xml"}}}

12:37:39.285 response time in milliseconds: 3547.65
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:37:38 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:37:37 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/63b26c6d-997f-40c7-ad40-5871119eea64.json","testRuns":{"TestRun":{"id":"EID63b26c6d-997f-40c7-ad40-5871119eea64","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:37:37.283Z","testTasks":{"TestTask":{"id":"EIDe99f7a6f-6e75-4953-a4cf-00aeacb38648","parent":{"ref":"EID63b26c6d-997f-40c7-ad40-5871119eea64"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID1e1bd670-9396-44ad-bfb8-010e78f71e72"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID63b26c6d-997f-40c7-ad40-5871119eea64/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID1e1bd670-9396-44ad-bfb8-010e78f71e72","remoteResource":"https://geodata.nationaalgeoregister.nl/rvo/inspire/invasieve-exoten/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:37:35.835Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:37:36.875Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rvo/inspire/invasieve-exoten/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.007
* print response.EtfItemCollection.testRuns.TestRun.id 0.023
12:37:39.364 [print] EID63b26c6d-997f-40c7-ad40-5871119eea64
* print response.EtfItemCollection.testRuns.TestRun.status 0.004
12:37:39.369 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.013
12:37:39.382 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.003
12:37:39.386 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/63b26c6d-997f-40c7-ad40-5871119eea64.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.014
12:37:39.400 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID63b26c6d-997f-40c7-ad40-5871119eea64/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.006
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.012
* print 'statuspath', statuspath 0.025
12:37:39.445 [print] statuspath TestRuns/EID63b26c6d-997f-40c7-ad40-5871119eea64
* print 'progresspath ', progresspath 0.012
12:37:39.458 [print] progresspath  TestRuns/EID63b26c6d-997f-40c7-ad40-5871119eea64/progress
Given path progresspath 0.000
When method GET 2.067
12:37:39.464 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID63b26c6d-997f-40c7-ad40-5871119eea64/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:37:41.525 response time in milliseconds: 2060.08
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:37:41 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:37:41.526 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 2.065
12:37:41.527 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID63b26c6d-997f-40c7-ad40-5871119eea64/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:37:43.577 response time in milliseconds: 2047.41
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:37:43 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
* print response 0.000
12:37:43.592 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path statuspath 0.000
When method GET 1.582
12:37:43.598 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID63b26c6d-997f-40c7-ad40-5871119eea64
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:37:45.166 response time in milliseconds: 1087.73
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:37:44 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:37:37 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/63b26c6d-997f-40c7-ad40-5871119eea64.json","testRuns":{"TestRun":{"id":"EID63b26c6d-997f-40c7-ad40-5871119eea64","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:37:37.283Z","testTasks":{"TestTask":{"id":"EIDe99f7a6f-6e75-4953-a4cf-00aeacb38648","parent":{"ref":"EID63b26c6d-997f-40c7-ad40-5871119eea64"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID1e1bd670-9396-44ad-bfb8-010e78f71e72"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID63b26c6d-997f-40c7-ad40-5871119eea64/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID1e1bd670-9396-44ad-bfb8-010e78f71e72","remoteResource":"https://geodata.nationaalgeoregister.nl/rvo/inspire/invasieve-exoten/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:37:35.835Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:37:36.875Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rvo/inspire/invasieve-exoten/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:37:45.179 [print] EID63b26c6d-997f-40c7-ad40-5871119eea64
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:37:45.180 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:37:45.181 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:37:45.182 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.001
12:37:45.184 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/63b26c6d-997f-40c7-ad40-5871119eea64.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.001
12:37:45.186 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/63b26c6d-997f-40c7-ad40-5871119eea64.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.007
12:37:45.194 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID63b26c6d-997f-40c7-ad40-5871119eea64/log
* def embedUrl = 0.003
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.044
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.004
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.064
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.057
* def a = embedUrl ("../../" + jsonPath , status ) 0.018
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.003
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
11.842
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:39:07.475 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2015/atom/v1_0/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 4.818
12:39:07.476 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 286
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2015/atom/v1_0/index.xml"}}}

12:39:12.289 response time in milliseconds: 4080.00
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:39:11 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:39:10 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/87279f56-8fe9-4439-917d-bfa11c55553d.json","testRuns":{"TestRun":{"id":"EID87279f56-8fe9-4439-917d-bfa11c55553d","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:09.354Z","testTasks":{"TestTask":{"id":"EID32831582-4b2e-406b-b0bd-81341c540313","parent":{"ref":"EID87279f56-8fe9-4439-917d-bfa11c55553d"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDf2102234-b2a0-4563-9074-7b81de6194f5"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID87279f56-8fe9-4439-917d-bfa11c55553d/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDf2102234-b2a0-4563-9074-7b81de6194f5","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2015/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:39:07.902Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:08.778Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2015/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.004
12:39:12.299 [print] EID87279f56-8fe9-4439-917d-bfa11c55553d
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:12.299 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:12.299 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:12.299 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/87279f56-8fe9-4439-917d-bfa11c55553d.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:12.300 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID87279f56-8fe9-4439-917d-bfa11c55553d/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:39:12.300 [print] statuspath TestRuns/EID87279f56-8fe9-4439-917d-bfa11c55553d
* print 'progresspath ', progresspath 0.000
12:39:12.300 [print] progresspath  TestRuns/EID87279f56-8fe9-4439-917d-bfa11c55553d/progress
Given path progresspath 0.000
When method GET 2.012
12:39:12.301 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID87279f56-8fe9-4439-917d-bfa11c55553d/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:14.312 response time in milliseconds: 2010.69
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:39:14 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:39:14.312 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 2.022
12:39:14.313 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID87279f56-8fe9-4439-917d-bfa11c55553d/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:16.334 response time in milliseconds: 2021.23
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:39:16 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
* print response 0.000
12:39:16.335 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path statuspath 0.000
When method GET 2.975
12:39:16.335 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID87279f56-8fe9-4439-917d-bfa11c55553d
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:19.308 response time in milliseconds: 2234.32
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:39:18 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:39:16 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/87279f56-8fe9-4439-917d-bfa11c55553d.json","testRuns":{"TestRun":{"id":"EID87279f56-8fe9-4439-917d-bfa11c55553d","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:09.354Z","testTasks":{"TestTask":{"id":"EID32831582-4b2e-406b-b0bd-81341c540313","parent":{"ref":"EID87279f56-8fe9-4439-917d-bfa11c55553d"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDf2102234-b2a0-4563-9074-7b81de6194f5"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID87279f56-8fe9-4439-917d-bfa11c55553d/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDf2102234-b2a0-4563-9074-7b81de6194f5","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2015/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:39:07.902Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:08.778Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2015/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:39:19.311 [print] EID87279f56-8fe9-4439-917d-bfa11c55553d
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:19.311 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:39:19.311 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:19.311 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:19.311 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/87279f56-8fe9-4439-917d-bfa11c55553d.json
* def ref = response.EtfItemCollection.ref 0.003
* print ref 0.000
12:39:19.315 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/87279f56-8fe9-4439-917d-bfa11c55553d.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:19.315 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID87279f56-8fe9-4439-917d-bfa11c55553d/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.002
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
7.937
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:37:52.804 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/bestandbodemgebruik2015/atom/bestandbodemgebruik2015.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 3.372
12:37:52.806 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 295
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/bestandbodemgebruik2015/atom/bestandbodemgebruik2015.xml"}}}

12:37:56.175 response time in milliseconds: 2629.84
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:37:55 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:37:54 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/4ac75300-8e41-425a-9dea-a2c0a833f793.json","testRuns":{"TestRun":{"id":"EID4ac75300-8e41-425a-9dea-a2c0a833f793","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:37:54.162Z","testTasks":{"TestTask":{"id":"EID6ddac8d0-b401-4d45-a6ea-ed4df84595e6","parent":{"ref":"EID4ac75300-8e41-425a-9dea-a2c0a833f793"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID72d13a9f-e7dd-46c9-b8a1-f74401c6e14f"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID4ac75300-8e41-425a-9dea-a2c0a833f793/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID72d13a9f-e7dd-46c9-b8a1-f74401c6e14f","remoteResource":"https://geodata.nationaalgeoregister.nl/bestandbodemgebruik2015/atom/bestandbodemgebruik2015.xml","label":"bestandbodemgebruik2015.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:37:53.237Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:37:53.884Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/bestandbodemgebruik2015/atom/bestandbodemgebruik2015.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:37:56.179 [print] EID4ac75300-8e41-425a-9dea-a2c0a833f793
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:37:56.179 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.009
12:37:56.189 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.001
12:37:56.190 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/4ac75300-8e41-425a-9dea-a2c0a833f793.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.001
12:37:56.192 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID4ac75300-8e41-425a-9dea-a2c0a833f793/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:37:56.193 [print] statuspath TestRuns/EID4ac75300-8e41-425a-9dea-a2c0a833f793
* print 'progresspath ', progresspath 0.006
12:37:56.200 [print] progresspath  TestRuns/EID4ac75300-8e41-425a-9dea-a2c0a833f793/progress
Given path progresspath 0.000
When method GET 2.024
12:37:56.201 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID4ac75300-8e41-425a-9dea-a2c0a833f793/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:37:58.224 response time in milliseconds: 2022.60
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:37:58 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:37:58.224 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 0.539
12:37:58.226 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID4ac75300-8e41-425a-9dea-a2c0a833f793/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:37:58.763 response time in milliseconds: 535.74
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:37:58 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.001
12:37:58.765 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 1.925
12:37:58.772 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID4ac75300-8e41-425a-9dea-a2c0a833f793
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:00.683 response time in milliseconds: 1367.78
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:38:00 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:37:54 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/4ac75300-8e41-425a-9dea-a2c0a833f793.json","testRuns":{"TestRun":{"id":"EID4ac75300-8e41-425a-9dea-a2c0a833f793","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:37:54.162Z","testTasks":{"TestTask":{"id":"EID6ddac8d0-b401-4d45-a6ea-ed4df84595e6","parent":{"ref":"EID4ac75300-8e41-425a-9dea-a2c0a833f793"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID72d13a9f-e7dd-46c9-b8a1-f74401c6e14f"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID4ac75300-8e41-425a-9dea-a2c0a833f793/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID72d13a9f-e7dd-46c9-b8a1-f74401c6e14f","remoteResource":"https://geodata.nationaalgeoregister.nl/bestandbodemgebruik2015/atom/bestandbodemgebruik2015.xml","label":"bestandbodemgebruik2015.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:37:53.237Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:37:53.884Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/bestandbodemgebruik2015/atom/bestandbodemgebruik2015.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.015
12:38:00.707 [print] EID4ac75300-8e41-425a-9dea-a2c0a833f793
* print response.EtfItemCollection.testRuns.TestRun.status 0.006
12:38:00.714 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:00.715 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:00.716 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:00.716 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/4ac75300-8e41-425a-9dea-a2c0a833f793.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:38:00.716 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/4ac75300-8e41-425a-9dea-a2c0a833f793.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:00.717 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID4ac75300-8e41-425a-9dea-a2c0a833f793/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.002
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.014
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.008
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
10.797
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:38:03.685 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/richtlijnoverstromingsrisico2018/atom/v1_0/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 4.210
12:38:03.686 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 295
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/richtlijnoverstromingsrisico2018/atom/v1_0/index.xml"}}}

12:38:07.893 response time in milliseconds: 3470.01
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:07 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:06 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/234ba79e-7fd3-44b5-b1af-5f44d39b2234.json","testRuns":{"TestRun":{"id":"EID234ba79e-7fd3-44b5-b1af-5f44d39b2234","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:05.972Z","testTasks":{"TestTask":{"id":"EID9a13b7de-cc46-4b4f-ae79-047ac899c504","parent":{"ref":"EID234ba79e-7fd3-44b5-b1af-5f44d39b2234"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDbf14737d-ea32-4fe5-8f3c-660bbdd37815"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID234ba79e-7fd3-44b5-b1af-5f44d39b2234/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDbf14737d-ea32-4fe5-8f3c-660bbdd37815","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/richtlijnoverstromingsrisico2018/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:04.163Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:05.581Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/richtlijnoverstromingsrisico2018/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.002
12:38:07.899 [print] EID234ba79e-7fd3-44b5-b1af-5f44d39b2234
* print response.EtfItemCollection.testRuns.TestRun.status 0.001
12:38:07.900 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:07.900 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:07.901 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/234ba79e-7fd3-44b5-b1af-5f44d39b2234.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:07.902 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID234ba79e-7fd3-44b5-b1af-5f44d39b2234/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.001
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:38:07.904 [print] statuspath TestRuns/EID234ba79e-7fd3-44b5-b1af-5f44d39b2234
* print 'progresspath ', progresspath 0.000
12:38:07.905 [print] progresspath  TestRuns/EID234ba79e-7fd3-44b5-b1af-5f44d39b2234/progress
Given path progresspath 0.000
When method GET 2.041
12:38:07.907 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID234ba79e-7fd3-44b5-b1af-5f44d39b2234/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:09.946 response time in milliseconds: 2022.03
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:38:09 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:38:09.946 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 0.507
12:38:09.947 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID234ba79e-7fd3-44b5-b1af-5f44d39b2234/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:10.453 response time in milliseconds: 505.15
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:38:10 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:38:10.453 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 4.015
12:38:10.454 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID234ba79e-7fd3-44b5-b1af-5f44d39b2234
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:14.465 response time in milliseconds: 3268.48
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:38:13 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:08 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/234ba79e-7fd3-44b5-b1af-5f44d39b2234.json","testRuns":{"TestRun":{"id":"EID234ba79e-7fd3-44b5-b1af-5f44d39b2234","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:05.972Z","testTasks":{"TestTask":{"id":"EID9a13b7de-cc46-4b4f-ae79-047ac899c504","parent":{"ref":"EID234ba79e-7fd3-44b5-b1af-5f44d39b2234"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDbf14737d-ea32-4fe5-8f3c-660bbdd37815"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID234ba79e-7fd3-44b5-b1af-5f44d39b2234/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDbf14737d-ea32-4fe5-8f3c-660bbdd37815","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/richtlijnoverstromingsrisico2018/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:04.163Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:05.581Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/richtlijnoverstromingsrisico2018/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.007
12:38:14.477 [print] EID234ba79e-7fd3-44b5-b1af-5f44d39b2234
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:14.477 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:14.477 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:14.477 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:14.477 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/234ba79e-7fd3-44b5-b1af-5f44d39b2234.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:38:14.477 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/234ba79e-7fd3-44b5-b1af-5f44d39b2234.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:14.478 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID234ba79e-7fd3-44b5-b1af-5f44d39b2234/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.003
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
9.703
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:38:23.640 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 5.538
12:38:23.642 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 295
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml"}}}

12:38:29.176 response time in milliseconds: 4767.12
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:28 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:25 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/4d4c55b9-af93-450a-af8a-cc1cadbd328f.json","testRuns":{"TestRun":{"id":"EID4d4c55b9-af93-450a-af8a-cc1cadbd328f","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:25.131Z","testTasks":{"TestTask":{"id":"EIDa5b938a1-61c3-415a-9027-758f5d9c3c76","parent":{"ref":"EID4d4c55b9-af93-450a-af8a-cc1cadbd328f"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDfc10a977-a217-4feb-8484-154826c68beb"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID4d4c55b9-af93-450a-af8a-cc1cadbd328f/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDfc10a977-a217-4feb-8484-154826c68beb","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:24.077Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:24.787Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:29.180 [print] EID4d4c55b9-af93-450a-af8a-cc1cadbd328f
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:29.180 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:29.180 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:29.180 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/4d4c55b9-af93-450a-af8a-cc1cadbd328f.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:29.180 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID4d4c55b9-af93-450a-af8a-cc1cadbd328f/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.016
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:38:29.198 [print] statuspath TestRuns/EID4d4c55b9-af93-450a-af8a-cc1cadbd328f
* print 'progresspath ', progresspath 0.000
12:38:29.198 [print] progresspath  TestRuns/EID4d4c55b9-af93-450a-af8a-cc1cadbd328f/progress
Given path progresspath 0.000
When method GET 2.026
12:38:29.205 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID4d4c55b9-af93-450a-af8a-cc1cadbd328f/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:31.224 response time in milliseconds: 2019.10
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:38:31 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:38:31.225 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 0.525
12:38:31.225 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID4d4c55b9-af93-450a-af8a-cc1cadbd328f/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:31.750 response time in milliseconds: 524.06
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:38:31 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:38:31.750 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 1.582
12:38:31.751 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID4d4c55b9-af93-450a-af8a-cc1cadbd328f
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:33.330 response time in milliseconds: 1151.16
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:38:32 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:28 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/4d4c55b9-af93-450a-af8a-cc1cadbd328f.json","testRuns":{"TestRun":{"id":"EID4d4c55b9-af93-450a-af8a-cc1cadbd328f","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:25.131Z","testTasks":{"TestTask":{"id":"EIDa5b938a1-61c3-415a-9027-758f5d9c3c76","parent":{"ref":"EID4d4c55b9-af93-450a-af8a-cc1cadbd328f"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EIDfc10a977-a217-4feb-8484-154826c68beb"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID4d4c55b9-af93-450a-af8a-cc1cadbd328f/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EIDfc10a977-a217-4feb-8484-154826c68beb","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:24.077Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:24.787Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:33.333 [print] EID4d4c55b9-af93-450a-af8a-cc1cadbd328f
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:33.333 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:33.334 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:33.334 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:33.334 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/4d4c55b9-af93-450a-af8a-cc1cadbd328f.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:38:33.334 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/4d4c55b9-af93-450a-af8a-cc1cadbd328f.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:33.334 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID4d4c55b9-af93-450a-af8a-cc1cadbd328f/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.003
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.002
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.001
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
10.390
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.003
12:38:08.317 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2009/atom/v1_0/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 6.156
12:38:08.319 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 286
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2009/atom/v1_0/index.xml"}}}

12:38:14.469 response time in milliseconds: 5397.82
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:13 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:11 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/077355e4-9127-4e3e-9835-d5c5bc61f0e6.json","testRuns":{"TestRun":{"id":"EID077355e4-9127-4e3e-9835-d5c5bc61f0e6","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:10.724Z","testTasks":{"TestTask":{"id":"EID0418360f-e4c5-4885-aa56-692ecac66c0f","parent":{"ref":"EID077355e4-9127-4e3e-9835-d5c5bc61f0e6"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID05890a61-a1af-499e-b7cb-4e6bb29c89a2"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID077355e4-9127-4e3e-9835-d5c5bc61f0e6/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID05890a61-a1af-499e-b7cb-4e6bb29c89a2","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2009/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:08.759Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:10.225Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2009/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.003
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:14.478 [print] EID077355e4-9127-4e3e-9835-d5c5bc61f0e6
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:14.478 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.007
12:38:14.486 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:14.486 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/077355e4-9127-4e3e-9835-d5c5bc61f0e6.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:14.486 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID077355e4-9127-4e3e-9835-d5c5bc61f0e6/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:38:14.487 [print] statuspath TestRuns/EID077355e4-9127-4e3e-9835-d5c5bc61f0e6
* print 'progresspath ', progresspath 0.000
12:38:14.487 [print] progresspath  TestRuns/EID077355e4-9127-4e3e-9835-d5c5bc61f0e6/progress
Given path progresspath 0.000
When method GET 2.110
12:38:14.499 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID077355e4-9127-4e3e-9835-d5c5bc61f0e6/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:16.597 response time in milliseconds: 2097.43
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:38:16 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:38:16.598 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 0.528
12:38:16.598 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID077355e4-9127-4e3e-9835-d5c5bc61f0e6/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:17.125 response time in milliseconds: 526.08
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:38:17 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:38:17.126 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 1.548
12:38:17.126 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID077355e4-9127-4e3e-9835-d5c5bc61f0e6
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:18.670 response time in milliseconds: 1112.78
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:38:18 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:15 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/077355e4-9127-4e3e-9835-d5c5bc61f0e6.json","testRuns":{"TestRun":{"id":"EID077355e4-9127-4e3e-9835-d5c5bc61f0e6","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:10.724Z","testTasks":{"TestTask":{"id":"EID0418360f-e4c5-4885-aa56-692ecac66c0f","parent":{"ref":"EID077355e4-9127-4e3e-9835-d5c5bc61f0e6"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID05890a61-a1af-499e-b7cb-4e6bb29c89a2"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID077355e4-9127-4e3e-9835-d5c5bc61f0e6/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID05890a61-a1af-499e-b7cb-4e6bb29c89a2","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2009/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:08.759Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:10.225Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwater2009/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.011
12:38:18.686 [print] EID077355e4-9127-4e3e-9835-d5c5bc61f0e6
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:18.687 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:18.687 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:18.688 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:18.688 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/077355e4-9127-4e3e-9835-d5c5bc61f0e6.json
* def ref = response.EtfItemCollection.ref 0.008
* print ref 0.000
12:38:18.697 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/077355e4-9127-4e3e-9835-d5c5bc61f0e6.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:18.698 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID077355e4-9127-4e3e-9835-d5c5bc61f0e6/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.002
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.002
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
7.339
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:38:35.032 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 3.236
12:38:35.033 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 253
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}

12:38:38.263 response time in milliseconds: 2484.30
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:37 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:36 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/d9e1edb6-e3f6-40ae-b6db-2558d0eeec1e.json","testRuns":{"TestRun":{"id":"EIDd9e1edb6-e3f6-40ae-b6db-2558d0eeec1e","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:36.447Z","testTasks":{"TestTask":{"id":"EID47342ea9-32cb-4eff-ab79-3ea3e0c0b27c","parent":{"ref":"EIDd9e1edb6-e3f6-40ae-b6db-2558d0eeec1e"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID9b2f28ac-a019-4115-a40c-9bb412b9561e"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EIDd9e1edb6-e3f6-40ae-b6db-2558d0eeec1e/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID9b2f28ac-a019-4115-a40c-9bb412b9561e","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:35.467Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:36.141Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:38.271 [print] EIDd9e1edb6-e3f6-40ae-b6db-2558d0eeec1e
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:38.273 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.001
12:38:38.274 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.001
12:38:38.275 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/d9e1edb6-e3f6-40ae-b6db-2558d0eeec1e.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.001
12:38:38.276 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EIDd9e1edb6-e3f6-40ae-b6db-2558d0eeec1e/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.002
12:38:38.279 [print] statuspath TestRuns/EIDd9e1edb6-e3f6-40ae-b6db-2558d0eeec1e
* print 'progresspath ', progresspath 0.001
12:38:38.280 [print] progresspath  TestRuns/EIDd9e1edb6-e3f6-40ae-b6db-2558d0eeec1e/progress
Given path progresspath 0.000
When method GET 2.016
12:38:38.283 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EIDd9e1edb6-e3f6-40ae-b6db-2558d0eeec1e/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:40.296 response time in milliseconds: 2012.95
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:38:40 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:38:40.297 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 0.514
12:38:40.298 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EIDd9e1edb6-e3f6-40ae-b6db-2558d0eeec1e/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:40.811 response time in milliseconds: 512.74
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:38:40 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:38:40.811 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 1.555
12:38:40.812 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EIDd9e1edb6-e3f6-40ae-b6db-2558d0eeec1e
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:42.365 response time in milliseconds: 1120.67
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:38:41 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:39 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/d9e1edb6-e3f6-40ae-b6db-2558d0eeec1e.json","testRuns":{"TestRun":{"id":"EIDd9e1edb6-e3f6-40ae-b6db-2558d0eeec1e","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:36.447Z","testTasks":{"TestTask":{"id":"EID47342ea9-32cb-4eff-ab79-3ea3e0c0b27c","parent":{"ref":"EIDd9e1edb6-e3f6-40ae-b6db-2558d0eeec1e"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID9b2f28ac-a019-4115-a40c-9bb412b9561e"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EIDd9e1edb6-e3f6-40ae-b6db-2558d0eeec1e/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID9b2f28ac-a019-4115-a40c-9bb412b9561e","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:35.467Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:36.141Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:42.368 [print] EIDd9e1edb6-e3f6-40ae-b6db-2558d0eeec1e
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:42.368 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:42.368 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:42.368 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:42.368 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/d9e1edb6-e3f6-40ae-b6db-2558d0eeec1e.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:38:42.369 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/d9e1edb6-e3f6-40ae-b6db-2558d0eeec1e.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:42.369 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EIDd9e1edb6-e3f6-40ae-b6db-2558d0eeec1e/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.003
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
9.077
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:38:10.380 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwateractueel/atom/v1_0/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 6.317
12:38:10.381 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 289
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwateractueel/atom/v1_0/index.xml"}}}

12:38:16.695 response time in milliseconds: 5567.50
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:15 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:14 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/fc1fb5c6-3d64-410e-bfc9-d980928d1d22.json","testRuns":{"TestRun":{"id":"EIDfc1fb5c6-3d64-410e-bfc9-d980928d1d22","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:13.533Z","testTasks":{"TestTask":{"id":"EID91f563ea-d75e-46e1-840a-c74c1ed39ccb","parent":{"ref":"EIDfc1fb5c6-3d64-410e-bfc9-d980928d1d22"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID1adde79a-285b-461a-a41d-9a8a322fb1fd"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EIDfc1fb5c6-3d64-410e-bfc9-d980928d1d22/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID1adde79a-285b-461a-a41d-9a8a322fb1fd","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwateractueel/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:10.815Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:12.185Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwateractueel/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:16.699 [print] EIDfc1fb5c6-3d64-410e-bfc9-d980928d1d22
* print response.EtfItemCollection.testRuns.TestRun.status 0.001
12:38:16.701 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:16.701 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.001
12:38:16.702 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/fc1fb5c6-3d64-410e-bfc9-d980928d1d22.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.006
12:38:16.708 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EIDfc1fb5c6-3d64-410e-bfc9-d980928d1d22/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.001
12:38:16.710 [print] statuspath TestRuns/EIDfc1fb5c6-3d64-410e-bfc9-d980928d1d22
* print 'progresspath ', progresspath 0.000
12:38:16.710 [print] progresspath  TestRuns/EIDfc1fb5c6-3d64-410e-bfc9-d980928d1d22/progress
Given path progresspath 0.000
When method GET 0.523
12:38:16.712 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EIDfc1fb5c6-3d64-410e-bfc9-d980928d1d22/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:17.234 response time in milliseconds: 520.99
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:38:17 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
And retry until response.val == response.max 0.000
* print response 0.000
12:38:17.234 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path progresspath 0.000
When method GET 0.532
12:38:17.235 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EIDfc1fb5c6-3d64-410e-bfc9-d980928d1d22/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:17.766 response time in milliseconds: 529.12
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:38:17 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:38:17.767 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 1.673
12:38:17.768 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EIDfc1fb5c6-3d64-410e-bfc9-d980928d1d22
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:19.439 response time in milliseconds: 1236.82
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:38:18 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:15 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/fc1fb5c6-3d64-410e-bfc9-d980928d1d22.json","testRuns":{"TestRun":{"id":"EIDfc1fb5c6-3d64-410e-bfc9-d980928d1d22","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:13.533Z","testTasks":{"TestTask":{"id":"EID91f563ea-d75e-46e1-840a-c74c1ed39ccb","parent":{"ref":"EIDfc1fb5c6-3d64-410e-bfc9-d980928d1d22"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID1adde79a-285b-461a-a41d-9a8a322fb1fd"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EIDfc1fb5c6-3d64-410e-bfc9-d980928d1d22/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID1adde79a-285b-461a-a41d-9a8a322fb1fd","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwateractueel/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:10.815Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:12.185Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnwateractueel/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:19.441 [print] EIDfc1fb5c6-3d64-410e-bfc9-d980928d1d22
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:19.442 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:19.442 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:19.442 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:19.442 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/fc1fb5c6-3d64-410e-bfc9-d980928d1d22.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:38:19.442 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/fc1fb5c6-3d64-410e-bfc9-d980928d1d22.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:19.442 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EIDfc1fb5c6-3d64-410e-bfc9-d980928d1d22/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.002
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.004
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.002
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.005
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
9.107
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:38:37.455 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 3.485
12:38:37.457 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 253
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}

12:38:40.938 response time in milliseconds: 2736.74
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:40 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:39 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/45cea842-3774-460d-9f57-640c4a27b250.json","testRuns":{"TestRun":{"id":"EID45cea842-3774-460d-9f57-640c4a27b250","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:38.94Z","testTasks":{"TestTask":{"id":"EID8f0fed03-85d6-4f99-b9e7-2a9ad7178187","parent":{"ref":"EID45cea842-3774-460d-9f57-640c4a27b250"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID7993ecad-c95f-4f01-a360-39926deb2963"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID45cea842-3774-460d-9f57-640c4a27b250/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID7993ecad-c95f-4f01-a360-39926deb2963","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:37.889Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:38.653Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.001
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:40.942 [print] EID45cea842-3774-460d-9f57-640c4a27b250
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:40.942 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:40.942 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:40.942 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/45cea842-3774-460d-9f57-640c4a27b250.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:40.943 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID45cea842-3774-460d-9f57-640c4a27b250/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:38:40.943 [print] statuspath TestRuns/EID45cea842-3774-460d-9f57-640c4a27b250
* print 'progresspath ', progresspath 0.000
12:38:40.944 [print] progresspath  TestRuns/EID45cea842-3774-460d-9f57-640c4a27b250/progress
Given path progresspath 0.000
When method GET 2.012
12:38:40.944 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID45cea842-3774-460d-9f57-640c4a27b250/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:42.956 response time in milliseconds: 2011.36
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:38:42 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:38:42.956 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 2.023
12:38:42.957 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID45cea842-3774-460d-9f57-640c4a27b250/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:44.979 response time in milliseconds: 2021.43
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:38:44 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
* print response 0.000
12:38:44.980 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path statuspath 0.000
When method GET 1.571
12:38:44.980 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID45cea842-3774-460d-9f57-640c4a27b250
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:46.549 response time in milliseconds: 1137.21
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:38:46 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:42 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/45cea842-3774-460d-9f57-640c4a27b250.json","testRuns":{"TestRun":{"id":"EID45cea842-3774-460d-9f57-640c4a27b250","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:38.94Z","testTasks":{"TestTask":{"id":"EID8f0fed03-85d6-4f99-b9e7-2a9ad7178187","parent":{"ref":"EID45cea842-3774-460d-9f57-640c4a27b250"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID7993ecad-c95f-4f01-a360-39926deb2963"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID45cea842-3774-460d-9f57-640c4a27b250/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID7993ecad-c95f-4f01-a360-39926deb2963","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:37.889Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:38.653Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:46.551 [print] EID45cea842-3774-460d-9f57-640c4a27b250
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:46.551 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:46.552 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:46.552 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:46.552 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/45cea842-3774-460d-9f57-640c4a27b250.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:38:46.552 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/45cea842-3774-460d-9f57-640c4a27b250.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:46.552 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID45cea842-3774-460d-9f57-640c4a27b250/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.008
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.001
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
10.000
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.019
12:38:19.203 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 3.633
12:38:19.206 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 253
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}

12:38:22.829 response time in milliseconds: 2859.26
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:21 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:21 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/2affa67a-a919-46a2-a86c-544407469d45.json","testRuns":{"TestRun":{"id":"EID2affa67a-a919-46a2-a86c-544407469d45","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:20.866Z","testTasks":{"TestTask":{"id":"EID7daeae56-179f-4f19-bae3-bed52a9f0012","parent":{"ref":"EID2affa67a-a919-46a2-a86c-544407469d45"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID8c1de70b-dfb1-49fb-855e-edb216bf2092"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID2affa67a-a919-46a2-a86c-544407469d45/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID8c1de70b-dfb1-49fb-855e-edb216bf2092","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:19.662Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:20.581Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.005
12:38:22.843 [print] EID2affa67a-a919-46a2-a86c-544407469d45
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:22.844 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:22.845 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:22.845 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/2affa67a-a919-46a2-a86c-544407469d45.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:22.846 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID2affa67a-a919-46a2-a86c-544407469d45/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.001
12:38:22.848 [print] statuspath TestRuns/EID2affa67a-a919-46a2-a86c-544407469d45
* print 'progresspath ', progresspath 0.000
12:38:22.848 [print] progresspath  TestRuns/EID2affa67a-a919-46a2-a86c-544407469d45/progress
Given path progresspath 0.000
When method GET 2.021
12:38:22.852 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID2affa67a-a919-46a2-a86c-544407469d45/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:24.870 response time in milliseconds: 2018.21
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:38:24 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:38:24.870 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 0.533
12:38:24.871 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID2affa67a-a919-46a2-a86c-544407469d45/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:25.402 response time in milliseconds: 530.58
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:38:25 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:38:25.404 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 3.740
12:38:25.405 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID2affa67a-a919-46a2-a86c-544407469d45
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:29.142 response time in milliseconds: 3010.87
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:38:28 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:21 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/2affa67a-a919-46a2-a86c-544407469d45.json","testRuns":{"TestRun":{"id":"EID2affa67a-a919-46a2-a86c-544407469d45","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:20.866Z","testTasks":{"TestTask":{"id":"EID7daeae56-179f-4f19-bae3-bed52a9f0012","parent":{"ref":"EID2affa67a-a919-46a2-a86c-544407469d45"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID8c1de70b-dfb1-49fb-855e-edb216bf2092"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID2affa67a-a919-46a2-a86c-544407469d45/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID8c1de70b-dfb1-49fb-855e-edb216bf2092","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:19.662Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:20.581Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.036
12:38:29.181 [print] EID2affa67a-a919-46a2-a86c-544407469d45
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:29.181 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:29.181 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:29.181 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:29.181 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/2affa67a-a919-46a2-a86c-544407469d45.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:38:29.181 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/2affa67a-a919-46a2-a86c-544407469d45.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:29.181 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID2affa67a-a919-46a2-a86c-544407469d45/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.002
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
8.637
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.003
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:38:06.606 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnmarienestrategie2018/atom/v1_0/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 3.350
12:38:06.607 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 297
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnmarienestrategie2018/atom/v1_0/index.xml"}}}

12:38:09.951 response time in milliseconds: 2587.74
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:09 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:08 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/704dd9c5-c60e-4060-9eee-1a1b071a04e6.json","testRuns":{"TestRun":{"id":"EID704dd9c5-c60e-4060-9eee-1a1b071a04e6","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:08.005Z","testTasks":{"TestTask":{"id":"EID4ab88de8-aa85-49f7-9b38-3d45cd0b11d2","parent":{"ref":"EID704dd9c5-c60e-4060-9eee-1a1b071a04e6"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID867bff17-a07f-445f-86b6-40da6bb706aa"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID704dd9c5-c60e-4060-9eee-1a1b071a04e6/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID867bff17-a07f-445f-86b6-40da6bb706aa","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnmarienestrategie2018/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:07.049Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:07.695Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnmarienestrategie2018/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:09.957 [print] EID704dd9c5-c60e-4060-9eee-1a1b071a04e6
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:09.958 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:09.958 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:09.958 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/704dd9c5-c60e-4060-9eee-1a1b071a04e6.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:09.958 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID704dd9c5-c60e-4060-9eee-1a1b071a04e6/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.003
12:38:09.963 [print] statuspath TestRuns/EID704dd9c5-c60e-4060-9eee-1a1b071a04e6
* print 'progresspath ', progresspath 0.006
12:38:09.969 [print] progresspath  TestRuns/EID704dd9c5-c60e-4060-9eee-1a1b071a04e6/progress
Given path progresspath 0.000
When method GET 2.035
12:38:09.971 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID704dd9c5-c60e-4060-9eee-1a1b071a04e6/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:11.981 response time in milliseconds: 2007.05
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:38:11 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:38:12.006 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 0.522
12:38:12.007 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID704dd9c5-c60e-4060-9eee-1a1b071a04e6/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:12.528 response time in milliseconds: 519.82
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:38:12 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:38:12.529 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 2.695
12:38:12.531 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID704dd9c5-c60e-4060-9eee-1a1b071a04e6
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:15.222 response time in milliseconds: 1954.34
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:38:14 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:11 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/704dd9c5-c60e-4060-9eee-1a1b071a04e6.json","testRuns":{"TestRun":{"id":"EID704dd9c5-c60e-4060-9eee-1a1b071a04e6","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:08.005Z","testTasks":{"TestTask":{"id":"EID4ab88de8-aa85-49f7-9b38-3d45cd0b11d2","parent":{"ref":"EID704dd9c5-c60e-4060-9eee-1a1b071a04e6"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID867bff17-a07f-445f-86b6-40da6bb706aa"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID704dd9c5-c60e-4060-9eee-1a1b071a04e6/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID867bff17-a07f-445f-86b6-40da6bb706aa","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnmarienestrategie2018/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:07.049Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:07.695Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnmarienestrategie2018/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:15.225 [print] EID704dd9c5-c60e-4060-9eee-1a1b071a04e6
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:15.226 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:15.226 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:15.226 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:15.226 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/704dd9c5-c60e-4060-9eee-1a1b071a04e6.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:38:15.226 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/704dd9c5-c60e-4060-9eee-1a1b071a04e6.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:15.226 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID704dd9c5-c60e-4060-9eee-1a1b071a04e6/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.011
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.001
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
9.172
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:38:54.064 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnmarienestrategie2018/atom/v1_0/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 5.703
12:38:54.065 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 297
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnmarienestrategie2018/atom/v1_0/index.xml"}}}

12:38:59.765 response time in milliseconds: 4939.13
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:58 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:56 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/9ea5561e-40b7-4c2f-ba6e-340317c70007.json","testRuns":{"TestRun":{"id":"EID9ea5561e-40b7-4c2f-ba6e-340317c70007","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:56.092Z","testTasks":{"TestTask":{"id":"EID1e21b860-ba22-4fa5-a9e8-05cf1d67a6f1","parent":{"ref":"EID9ea5561e-40b7-4c2f-ba6e-340317c70007"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID9a7fa2c6-731e-4cbe-b74c-6e5c5d49ec8c"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID9ea5561e-40b7-4c2f-ba6e-340317c70007/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID9a7fa2c6-731e-4cbe-b74c-6e5c5d49ec8c","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnmarienestrategie2018/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:54.497Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:55.252Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnmarienestrategie2018/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:59.768 [print] EID9ea5561e-40b7-4c2f-ba6e-340317c70007
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:59.768 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:59.768 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:59.768 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/9ea5561e-40b7-4c2f-ba6e-340317c70007.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.014
12:38:59.783 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID9ea5561e-40b7-4c2f-ba6e-340317c70007/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:38:59.783 [print] statuspath TestRuns/EID9ea5561e-40b7-4c2f-ba6e-340317c70007
* print 'progresspath ', progresspath 0.000
12:38:59.783 [print] progresspath  TestRuns/EID9ea5561e-40b7-4c2f-ba6e-340317c70007/progress
Given path progresspath 0.000
When method GET 0.524
12:38:59.784 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID9ea5561e-40b7-4c2f-ba6e-340317c70007/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:00.308 response time in milliseconds: 523.77
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:39:00 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
And retry until response.val == response.max 0.000
* print response 0.000
12:39:00.308 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path progresspath 0.000
When method GET 0.534
12:39:00.310 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID9ea5561e-40b7-4c2f-ba6e-340317c70007/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:00.844 response time in milliseconds: 533.71
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:39:00 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:39:00.844 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 2.375
12:39:00.845 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID9ea5561e-40b7-4c2f-ba6e-340317c70007
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:03.218 response time in milliseconds: 1612.91
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:39:02 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:56 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/9ea5561e-40b7-4c2f-ba6e-340317c70007.json","testRuns":{"TestRun":{"id":"EID9ea5561e-40b7-4c2f-ba6e-340317c70007","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:56.092Z","testTasks":{"TestTask":{"id":"EID1e21b860-ba22-4fa5-a9e8-05cf1d67a6f1","parent":{"ref":"EID9ea5561e-40b7-4c2f-ba6e-340317c70007"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID9a7fa2c6-731e-4cbe-b74c-6e5c5d49ec8c"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID9ea5561e-40b7-4c2f-ba6e-340317c70007/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID9a7fa2c6-731e-4cbe-b74c-6e5c5d49ec8c","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnmarienestrategie2018/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:54.497Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:55.252Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/kaderrichtlijnmarienestrategie2018/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:39:03.220 [print] EID9ea5561e-40b7-4c2f-ba6e-340317c70007
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:03.220 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:39:03.221 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:03.221 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:03.221 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/9ea5561e-40b7-4c2f-ba6e-340317c70007.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:39:03.221 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/9ea5561e-40b7-4c2f-ba6e-340317c70007.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:03.221 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID9ea5561e-40b7-4c2f-ba6e-340317c70007/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.015
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
9.994
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:38:49.788 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 4.923
12:38:49.789 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 295
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml"}}}

12:38:54.709 response time in milliseconds: 4057.22
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:53 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:52 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/0880425d-18c9-40ef-a713-2fcf6c0076fd.json","testRuns":{"TestRun":{"id":"EID0880425d-18c9-40ef-a713-2fcf6c0076fd","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:52.263Z","testTasks":{"TestTask":{"id":"EIDb2c1f389-e16d-41ba-8f4a-14e91dcfd1fd","parent":{"ref":"EID0880425d-18c9-40ef-a713-2fcf6c0076fd"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID5bf8752e-bb0a-476d-a0ef-6afc6e429929"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID0880425d-18c9-40ef-a713-2fcf6c0076fd/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID5bf8752e-bb0a-476d-a0ef-6afc6e429929","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:50.221Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:51.81Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.001
12:38:54.713 [print] EID0880425d-18c9-40ef-a713-2fcf6c0076fd
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:54.713 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:54.713 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:54.713 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/0880425d-18c9-40ef-a713-2fcf6c0076fd.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:54.714 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID0880425d-18c9-40ef-a713-2fcf6c0076fd/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:38:54.714 [print] statuspath TestRuns/EID0880425d-18c9-40ef-a713-2fcf6c0076fd
* print 'progresspath ', progresspath 0.000
12:38:54.714 [print] progresspath  TestRuns/EID0880425d-18c9-40ef-a713-2fcf6c0076fd/progress
Given path progresspath 0.000
When method GET 0.539
12:38:54.716 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID0880425d-18c9-40ef-a713-2fcf6c0076fd/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:55.253 response time in milliseconds: 536.52
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:38:55 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
And retry until response.val == response.max 0.000
* print response 0.000
12:38:55.253 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path progresspath 0.000
When method GET 0.521
12:38:55.254 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID0880425d-18c9-40ef-a713-2fcf6c0076fd/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:55.775 response time in milliseconds: 520.16
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:38:55 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:38:55.775 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 3.980
12:38:55.778 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID0880425d-18c9-40ef-a713-2fcf6c0076fd
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:59.754 response time in milliseconds: 3222.65
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:38:58 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:53 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/0880425d-18c9-40ef-a713-2fcf6c0076fd.json","testRuns":{"TestRun":{"id":"EID0880425d-18c9-40ef-a713-2fcf6c0076fd","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:52.263Z","testTasks":{"TestTask":{"id":"EIDb2c1f389-e16d-41ba-8f4a-14e91dcfd1fd","parent":{"ref":"EID0880425d-18c9-40ef-a713-2fcf6c0076fd"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID5bf8752e-bb0a-476d-a0ef-6afc6e429929"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID0880425d-18c9-40ef-a713-2fcf6c0076fd/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID5bf8752e-bb0a-476d-a0ef-6afc6e429929","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:50.221Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:51.81Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.011
12:38:59.768 [print] EID0880425d-18c9-40ef-a713-2fcf6c0076fd
* print response.EtfItemCollection.testRuns.TestRun.status 0.010
12:38:59.778 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:59.779 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:59.779 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:59.779 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/0880425d-18c9-40ef-a713-2fcf6c0076fd.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:38:59.779 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/0880425d-18c9-40ef-a713-2fcf6c0076fd.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:59.779 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID0880425d-18c9-40ef-a713-2fcf6c0076fd/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.002
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
10.439
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:38:59.141 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 6.106
12:38:59.142 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 295
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml"}}}

12:39:05.245 response time in milliseconds: 5351.97
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:39:04 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:39:01 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/89723550-ee20-4868-b2ef-ae8f3f3194d3.json","testRuns":{"TestRun":{"id":"EID89723550-ee20-4868-b2ef-ae8f3f3194d3","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:01.212Z","testTasks":{"TestTask":{"id":"EID9fc3865e-cb93-4f7b-859b-0e28bcaf8402","parent":{"ref":"EID89723550-ee20-4868-b2ef-ae8f3f3194d3"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID70f9b66b-2f91-48dd-b17b-951a4e2a4de5"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID89723550-ee20-4868-b2ef-ae8f3f3194d3/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID70f9b66b-2f91-48dd-b17b-951a4e2a4de5","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:59.567Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:00.69Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:39:05.248 [print] EID89723550-ee20-4868-b2ef-ae8f3f3194d3
* print response.EtfItemCollection.testRuns.TestRun.status 0.005
12:39:05.253 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:05.253 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:05.253 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/89723550-ee20-4868-b2ef-ae8f3f3194d3.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:05.253 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID89723550-ee20-4868-b2ef-ae8f3f3194d3/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:39:05.253 [print] statuspath TestRuns/EID89723550-ee20-4868-b2ef-ae8f3f3194d3
* print 'progresspath ', progresspath 0.000
12:39:05.253 [print] progresspath  TestRuns/EID89723550-ee20-4868-b2ef-ae8f3f3194d3/progress
Given path progresspath 0.000
When method GET 2.013
12:39:05.254 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID89723550-ee20-4868-b2ef-ae8f3f3194d3/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:07.267 response time in milliseconds: 2012.63
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:39:07 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"240","max":"240","log":[]}
And retry until response.val == response.max 0.000
* print response 0.000
12:39:07.267 [print] {
  "val": "240",
  "max": "240",
  "log": [
  ]
}
Given path progresspath 0.000
When method GET 0.519
12:39:07.268 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID89723550-ee20-4868-b2ef-ae8f3f3194d3/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:07.787 response time in milliseconds: 518.52
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:39:07 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:39:07.787 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 1.781
12:39:07.788 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID89723550-ee20-4868-b2ef-ae8f3f3194d3
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:09.566 response time in milliseconds: 1356.81
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:39:09 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:39:05 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/89723550-ee20-4868-b2ef-ae8f3f3194d3.json","testRuns":{"TestRun":{"id":"EID89723550-ee20-4868-b2ef-ae8f3f3194d3","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:01.212Z","testTasks":{"TestTask":{"id":"EID9fc3865e-cb93-4f7b-859b-0e28bcaf8402","parent":{"ref":"EID89723550-ee20-4868-b2ef-ae8f3f3194d3"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID70f9b66b-2f91-48dd-b17b-951a4e2a4de5"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID89723550-ee20-4868-b2ef-ae8f3f3194d3/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID70f9b66b-2f91-48dd-b17b-951a4e2a4de5","remoteResource":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:59.567Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:00.69Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/rws/richtlijnstedelijkafvalwater2015/atom/v1_0/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.008
12:39:09.577 [print] EID89723550-ee20-4868-b2ef-ae8f3f3194d3
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:09.577 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:39:09.577 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:09.577 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:09.577 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/89723550-ee20-4868-b2ef-ae8f3f3194d3.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:39:09.577 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/89723550-ee20-4868-b2ef-ae8f3f3194d3.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:09.577 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID89723550-ee20-4868-b2ef-ae8f3f3194d3/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.002
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
10.056
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:39:27.137 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 5.638
12:39:27.138 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 253
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}

12:39:32.774 response time in milliseconds: 4874.17
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:39:31 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:39:29 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/4ce179c9-2f61-463a-ab30-10bb5d28f180.json","testRuns":{"TestRun":{"id":"EID4ce179c9-2f61-463a-ab30-10bb5d28f180","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:28.645Z","testTasks":{"TestTask":{"id":"EID0ddc3540-c251-43fa-a66b-48894873297b","parent":{"ref":"EID4ce179c9-2f61-463a-ab30-10bb5d28f180"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID9206baef-3719-48f3-b343-78a7da302498"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID4ce179c9-2f61-463a-ab30-10bb5d28f180/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID9206baef-3719-48f3-b343-78a7da302498","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:39:27.582Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:28.278Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:39:32.776 [print] EID4ce179c9-2f61-463a-ab30-10bb5d28f180
* print response.EtfItemCollection.testRuns.TestRun.status 0.004
12:39:32.781 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:32.781 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:32.782 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/4ce179c9-2f61-463a-ab30-10bb5d28f180.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:32.782 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID4ce179c9-2f61-463a-ab30-10bb5d28f180/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:39:32.782 [print] statuspath TestRuns/EID4ce179c9-2f61-463a-ab30-10bb5d28f180
* print 'progresspath ', progresspath 0.000
12:39:32.782 [print] progresspath  TestRuns/EID4ce179c9-2f61-463a-ab30-10bb5d28f180/progress
Given path progresspath 0.000
When method GET 0.521
12:39:32.783 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID4ce179c9-2f61-463a-ab30-10bb5d28f180/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:33.304 response time in milliseconds: 520.88
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:39:33 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
And retry until response.val == response.max 0.000
* print response 0.000
12:39:33.304 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path progresspath 0.000
When method GET 0.520
12:39:33.305 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID4ce179c9-2f61-463a-ab30-10bb5d28f180/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:33.824 response time in milliseconds: 518.81
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:39:33 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:39:33.825 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 3.356
12:39:33.825 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID4ce179c9-2f61-463a-ab30-10bb5d28f180
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:37.179 response time in milliseconds: 2612.23
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:39:36 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:39:34 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/4ce179c9-2f61-463a-ab30-10bb5d28f180.json","testRuns":{"TestRun":{"id":"EID4ce179c9-2f61-463a-ab30-10bb5d28f180","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:28.645Z","testTasks":{"TestTask":{"id":"EID0ddc3540-c251-43fa-a66b-48894873297b","parent":{"ref":"EID4ce179c9-2f61-463a-ab30-10bb5d28f180"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID9206baef-3719-48f3-b343-78a7da302498"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID4ce179c9-2f61-463a-ab30-10bb5d28f180/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID9206baef-3719-48f3-b343-78a7da302498","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:39:27.582Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:28.278Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:39:37.182 [print] EID4ce179c9-2f61-463a-ab30-10bb5d28f180
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:37.182 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:39:37.182 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:37.182 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:37.182 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/4ce179c9-2f61-463a-ab30-10bb5d28f180.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.000
12:39:37.183 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/4ce179c9-2f61-463a-ab30-10bb5d28f180.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:37.183 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID4ce179c9-2f61-463a-ab30-10bb5d28f180/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.010
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
6.085
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.001
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:38:00.323 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.000
And request inspireload 0.000
When method post 3.404
12:38:00.333 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 253
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}

12:38:03.726 response time in milliseconds: 2647.92
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:38:02 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:38:02 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/53bdbfc6-dbb2-4330-9629-2e0ec78b0d14.json","testRuns":{"TestRun":{"id":"EID53bdbfc6-dbb2-4330-9629-2e0ec78b0d14","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:01.833Z","testTasks":{"TestTask":{"id":"EID4886b5d7-0754-43e0-820f-4bef004c2935","parent":{"ref":"EID53bdbfc6-dbb2-4330-9629-2e0ec78b0d14"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID037299c7-fe3b-42a3-bdce-36b2b0dc2c53"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID53bdbfc6-dbb2-4330-9629-2e0ec78b0d14/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID037299c7-fe3b-42a3-bdce-36b2b0dc2c53","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:00.773Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:01.457Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.007
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:03.736 [print] EID53bdbfc6-dbb2-4330-9629-2e0ec78b0d14
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:38:03.736 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:03.736 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:03.736 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/53bdbfc6-dbb2-4330-9629-2e0ec78b0d14.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.001
12:38:03.738 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID53bdbfc6-dbb2-4330-9629-2e0ec78b0d14/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:38:03.739 [print] statuspath TestRuns/EID53bdbfc6-dbb2-4330-9629-2e0ec78b0d14
* print 'progresspath ', progresspath 0.000
12:38:03.739 [print] progresspath  TestRuns/EID53bdbfc6-dbb2-4330-9629-2e0ec78b0d14/progress
Given path progresspath 0.000
When method GET 0.523
12:38:03.741 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID53bdbfc6-dbb2-4330-9629-2e0ec78b0d14/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:04.262 response time in milliseconds: 520.00
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:38:04 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
And retry until response.val == response.max 0.000
* print response 0.000
12:38:04.262 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path progresspath 0.000
When method GET 0.519
12:38:04.264 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID53bdbfc6-dbb2-4330-9629-2e0ec78b0d14/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:04.782 response time in milliseconds: 517.03
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:38:04 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:38:04.782 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 1.601
12:38:04.783 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID53bdbfc6-dbb2-4330-9629-2e0ec78b0d14
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:38:06.382 response time in milliseconds: 1144.19
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:38:05 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:38:02 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/53bdbfc6-dbb2-4330-9629-2e0ec78b0d14.json","testRuns":{"TestRun":{"id":"EID53bdbfc6-dbb2-4330-9629-2e0ec78b0d14","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:38:01.833Z","testTasks":{"TestTask":{"id":"EID4886b5d7-0754-43e0-820f-4bef004c2935","parent":{"ref":"EID53bdbfc6-dbb2-4330-9629-2e0ec78b0d14"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID037299c7-fe3b-42a3-bdce-36b2b0dc2c53"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID53bdbfc6-dbb2-4330-9629-2e0ec78b0d14/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID037299c7-fe3b-42a3-bdce-36b2b0dc2c53","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:38:00.773Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:38:01.457Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:38:06.385 [print] EID53bdbfc6-dbb2-4330-9629-2e0ec78b0d14
* print response.EtfItemCollection.testRuns.TestRun.status 0.011
12:38:06.392 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:38:06.397 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:38:06.397 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:38:06.398 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/53bdbfc6-dbb2-4330-9629-2e0ec78b0d14.json
* def ref = response.EtfItemCollection.ref 0.001
* print ref 0.000
12:38:06.400 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/53bdbfc6-dbb2-4330-9629-2e0ec78b0d14.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:38:06.400 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID53bdbfc6-dbb2-4330-9629-2e0ec78b0d14/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.003
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.003
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000
9.083
Scenario Outline Conformance Class Download Service - Pre-defined Atom Inspire testsuite id: EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93
Steps
* def resultmessage = karate.info.scenarioName + " " + karate.tagValues 0.000
* def testRunRequest = 0.000
{
  "label": "Conformance Class Download Service - Pre-defined Atom",
  "executableTestSuiteIds": [
    "EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"
  ],
  "arguments": {},
  "testObject": {
    "resources": {
      "serviceEndpoint": "<serviceEndpoint>"
    }
  }
}
* replace testRunRequest.serviceEndpoint = metadata.url 0.000
* print testRunRequest 0.000
12:39:14.311 [print] {"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}
* json inspireload = testRunRequest 0.000
Given path 'TestRuns' 0.002
And request inspireload 0.000
When method post 4.951
12:39:14.314 request:
1 > POST https://inspire.ec.europa.eu/validator/v2/TestRuns
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 253
1 > Content-Type: application/json; charset=UTF-8
1 > Host: inspire.ec.europa.eu
1 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)
{"label":"Conformance Class Download Service - Pre-defined Atom","executableTestSuiteIds":["EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"],"arguments":{},"testObject":{"resources":{"serviceEndpoint":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}}}

12:39:19.262 response time in milliseconds: 4199.90
1 < 201
1 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
1 < Cache-Control: public, max-age=120
1 < Connection: Keep-Alive
1 < Content-Type: application/json;charset=UTF-8
1 < Date: Mon, 02 Nov 2020 12:39:18 GMT
1 < Keep-Alive: timeout=3, max=100
1 < Last-Modified: Mon, 02 Nov 2020 12:39:16 GMT
1 < Server: nginx/1.16.1
1 < Vary: Origin
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/35c4a33b-22bb-4721-bfa1-34e9c0e8d482.json","testRuns":{"TestRun":{"id":"EID35c4a33b-22bb-4721-bfa1-34e9c0e8d482","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:15.881Z","testTasks":{"TestTask":{"id":"EID184db35b-d585-435c-a79a-8a732a4d6b74","parent":{"ref":"EID35c4a33b-22bb-4721-bfa1-34e9c0e8d482"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID58c1dd65-07a3-493b-acc2-9bed6fa469f0"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID35c4a33b-22bb-4721-bfa1-34e9c0e8d482/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID58c1dd65-07a3-493b-acc2-9bed6fa469f0","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:39:14.744Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:15.612Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
Then assert responseStatus == 200 || responseStatus == 201 0.000
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:39:19.265 [print] EID35c4a33b-22bb-4721-bfa1-34e9c0e8d482
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:19.265 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:19.266 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:19.266 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/35c4a33b-22bb-4721-bfa1-34e9c0e8d482.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:19.266 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID35c4a33b-22bb-4721-bfa1-34e9c0e8d482/log
* def statuspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id 0.000
* def progresspath = "TestRuns/" + response.EtfItemCollection.testRuns.TestRun.id + "/progress" 0.000
* print 'statuspath', statuspath 0.000
12:39:19.266 [print] statuspath TestRuns/EID35c4a33b-22bb-4721-bfa1-34e9c0e8d482
* print 'progresspath ', progresspath 0.000
12:39:19.266 [print] progresspath  TestRuns/EID35c4a33b-22bb-4721-bfa1-34e9c0e8d482/progress
Given path progresspath 0.000
When method GET 0.521
12:39:19.267 request:
2 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID35c4a33b-22bb-4721-bfa1-34e9c0e8d482/progress
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Host: inspire.ec.europa.eu
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:19.787 response time in milliseconds: 519.80
2 < 200
2 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
2 < Connection: Keep-Alive
2 < Content-Type: application/json;charset=UTF-8
2 < Date: Mon, 02 Nov 2020 12:39:19 GMT
2 < Keep-Alive: timeout=3, max=100
2 < Server: nginx/1.16.1
2 < Vary: Origin
2 < X-Frame-Options: SAMEORIGIN
2 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
And retry until response.val == response.max 0.000
* print response 0.000
12:39:19.787 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path progresspath 0.000
When method GET 0.566
12:39:19.788 request:
3 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID35c4a33b-22bb-4721-bfa1-34e9c0e8d482/progress
3 > Accept-Encoding: gzip,deflate
3 > Connection: Keep-Alive
3 > Host: inspire.ec.europa.eu
3 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:20.354 response time in milliseconds: 565.33
3 < 200
3 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
3 < Connection: Keep-Alive
3 < Content-Type: application/json;charset=UTF-8
3 < Date: Mon, 02 Nov 2020 12:39:20 GMT
3 < Keep-Alive: timeout=3, max=100
3 < Server: nginx/1.16.1
3 < Vary: Origin
3 < X-Frame-Options: SAMEORIGIN
3 < X-XSS-Protection: 1; mode=block
{"val":"100","max":"100","log":["Already completed"]}
* print response 0.000
12:39:20.354 [print] {
  "val": "100",
  "max": "100",
  "log": [
    "Already completed"
  ]
}
Given path statuspath 0.000
When method GET 3.025
12:39:20.355 request:
4 > GET https://inspire.ec.europa.eu/validator/v2/TestRuns/EID35c4a33b-22bb-4721-bfa1-34e9c0e8d482
4 > Accept-Encoding: gzip,deflate
4 > Connection: Keep-Alive
4 > Host: inspire.ec.europa.eu
4 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.5)

12:39:23.378 response time in milliseconds: 2260.79
4 < 200
4 < Access-Control-Allow-Origin: [*, https://inspire.ec.europa.eu/validator/]
4 < Cache-Control: public, max-age=120
4 < Connection: Keep-Alive
4 < Content-Type: application/json;charset=UTF-8
4 < Date: Mon, 02 Nov 2020 12:39:22 GMT
4 < Keep-Alive: timeout=3, max=100
4 < Last-Modified: Mon, 02 Nov 2020 12:39:20 GMT
4 < Server: nginx/1.16.1
4 < Vary: Origin
4 < X-Frame-Options: SAMEORIGIN
4 < X-XSS-Protection: 1; mode=block
{"EtfItemCollection":{"version":2.0,"returnedItems":1,"ref":"https://inspire.ec.europa.eu/validator//v2/TestRuns/35c4a33b-22bb-4721-bfa1-34e9c0e8d482.json","testRuns":{"TestRun":{"id":"EID35c4a33b-22bb-4721-bfa1-34e9c0e8d482","status":"UNDEFINED","label":"Conformance Class Download Service - Pre-defined Atom","defaultLang":"en","startTimestamp":"2020-11-02T12:39:15.881Z","testTasks":{"TestTask":{"id":"EID184db35b-d585-435c-a79a-8a732a4d6b74","parent":{"ref":"EID35c4a33b-22bb-4721-bfa1-34e9c0e8d482"},"executableTestSuite":{"ref":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93"},"testObject":{"ref":"EID58c1dd65-07a3-493b-acc2-9bed6fa469f0"},"ArgumentList":{"arguments":{"argument":{"name":"etf.testcases","$":"*"}}}}},"logPath":"https://inspire.ec.europa.eu/validator//v2/TestRuns/EID35c4a33b-22bb-4721-bfa1-34e9c0e8d482/log"}},"referencedItems":{"testItemTypes":null,"executableTestSuites":{"ExecutableTestSuite":{"id":"EID11571c92-3940-4f42-a6cd-5e2b1c6f4d93","remoteResource":"http://none","label":"Conformance Class: Download Service - Pre-defined Atom","description":"This test suite examines a Atom feed with Open Search description against the requirements related to the INSPIRE Pre-Defined Atom Download Service feed with sub-feeds for data sets. This test suite only examines requirements that are specific to a Pre-Defined Atom Download Service feed.\n<br/> <br/>\nThe test suite is divided into four test modules. In the first module 'Initialization and basic checks', basic queries are send to the Atom feed to ensure the endpoints are available. The 'Download Service Feed', 'Dataset Feed' and 'OpenSearch Description' test modules contain the actual test cases, derived from the Abstract Test Cases. If a test case in the first module fails, the three other modules are skipped!\n<br/> <br/>\nThere are a few test cases and test steps that are marked as 'technical test step' or 'technical test case' in the description. They are used to control the test execution flow of the steps. The description text of a technical test step indicates the test steps that are executed. If a technical test step fails, the other test steps, which have been called by the technical test step, should be checked first. To examine a reported issue, the assertion messages should be compared with the service responses which are included in the report. If the response contains an exception report, the request should be checked for 'incorrect' parameters (i.e. non-existing IDs). The test step description should refer to a point, from where the information has been gathered (i.e. from a previous request where the ID was listed).\n<br/> <br/> \n\nPlease report any issues or problems <a href=\"https://github.com/inspire-eu-validation/community/wiki/Your-feedback\" target=\"_blank\">in GitHub</a>.\n<br/> <br/>\nKnown limitations are documented in the description of the applicable test case or test assertion.\n<br/> <br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined\" target=\"_blank\">Conformance Class 'Pre-defined Atom'</a>","version":"1.0.5","author":"Geonovum and interactive instruments","creationDate":"2017-02-17T00:00:00Z","lastEditor":"interactive instruments GmbH","lastUpdateDate":"2019-09-24T14:42:00Z","disabled":false,"tags":{"tag":{"href":"https://inspire.ec.europa.eu/validator//v2/Tags/e51620af-bcf5-4719-ab0e-ef6226a572fa.json"}},"testDriver":{"href":"https://inspire.ec.europa.eu/validator//v2/Components/4838e01b-4186-4d2d-a93a-414b9e9a49a7.json"},"translationTemplateBundle":{"ref":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb"},"ParameterList":null,"supportedTestObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"testModules":{"TestModule":[{"id":"EID6266de5b-169b-4933-896b-803260ff568e","label":"Initialization and basic checks","description":"Perform basic check to ensure the top-level Download Service Feed is available and initialize the Executable Test Suite with gathered information.\n\nIf this test case fails, all other test cases will be skipped!\nEnsure that the schema locations and all endpoints can be queried!\n\nPlease note that for technical reasons this Executable Test Suite requires that schema locations must be accessible without any authentication mechanism.","testCases":{"TestCase":[{"id":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f","label":"Setup credentials and check if endpoint is available","description":"Technical test case. Initialize loggers and set credentials for the test run.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":[{"id":"EID4bafa73e-73b8-4153-a84b-c6cc0b04bd28","label":"Update Credentials","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"import de.interactive_instruments.xtf.Util;\n\n/** Set the credentials only if a username is provided */\ndef basicAuthUser = context.expand('${#Project#authUser}');\nif (basicAuthUser.length()>0) {\n\tlog.info(\"Setting credentials for user: \" + basicAuthUser);\n}\nUtil.updateCredentials(testRunner);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID602d9d35-1c42-4497-a386-7befaa3320eb","label":"HTTP status code 200 is returned","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ca63785-e385-4c4f-b8c6-d6742c415a0c","label":"30 seconds timeout","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID60ac748d-9fae-47f9-bc88-f7073077cc62","label":"No invalid characters before XML prolog","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.*\n\nif(!messageExchange.hasResponse()) {\n  throw new TranslatableAssertionError(\"TR.noDataReturned\")\n}\n\nif(messageExchange.responseContent.size()>7) {\n\tfinal String xmlProlog = messageExchange.responseContent.substring(0,7);\n\tif(!xmlProlog.trim().startsWith(\"<\")) {\n\t\tthrow new TranslatableAssertionError(\"TR.invalidXmlProlog\", \"prolog\", xmlProlog.replaceAll(\"\\\\p{C}\", \"?\") )\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5e954eb8-f4fb-49b6-a1e3-2bcec69dbd6b","label":"Root element 'feed' exists","parent":{"ref":"EID72c74c78-472f-4baa-bdd5-2dfb1c516bb7"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849","label":"Basic checks passed and Feed still accessible","description":"Check if the feed is available and the Test initialisation phase has been completed successfully.","parent":{"ref":"EID6266de5b-169b-4933-896b-803260ff568e"},"testSteps":{"TestStep":{"id":"EID7c915733-5218-4594-9e9a-066192707f1e","label":"Check URL is accessible","description":null,"parent":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6fb90bcf-0fb8-40d0-a34b-dc79e2392d4e","label":"HTTP status code 200 is returned","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID33c888b8-a272-4bc8-86b6-30966df1b6d4","label":"30 seconds timeout","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8e7403f0-6689-45d2-9eb2-3f83bc3be359","label":"root element 'feed' exists","parent":{"ref":"EID7c915733-5218-4594-9e9a-066192707f1e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}}]}},{"id":"EID59c49d09-616a-4a70-a918-2f31d345e38f","label":"Download Service Feed","description":"Test module for checking the top-level Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344","label":"Contact information","description":"The test case requests the Download Service feed and checks if the response contains the author name and email address.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 12: The 'author' element of a feed shall contain current contact information for an\nindividual or organisation responsible for the feed. At the minimum, a name\nand email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Download Service feed contact information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3b666b3e-f315-49be-b96a-2d27abf0ab94","label":"HTTP status code 200 is returned","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb3f699a6-e47b-4a89-a610-f01787de5ab0","label":"30 seconds timeout","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd2126146-4434-443a-8420-5b8adc6b1f6a","label":"Root element 'feed' exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9809e089-828d-4e58-a091-0b8a0d28956d","label":"Author name exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID4fe383ff-d457-4324-bdfd-d23c54dc6ebd","label":"Email address exists","parent":{"ref":"EID8857655a-05c6-461c-b0f8-09c88d7b1c44"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID035c2686-8af8-4972-a015-cd32b2ab17ac","label":"CRS information","description":"The test case requests the Download Service feed and checks if each feed entry contain an Atom 'category' element for each CRS.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 20: Each feed entry shall contain an Atom 'category' element for each CRS in\nwhich the pre-defined dataset is available. This category element shall refer to\na well-known definition of a coordinate reference system.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-crs-information\" target=\"_blank\">Abstract Test Case 'Download Service feed CRS information'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID035c2686-8af8-4972-a015-cd32b2ab17ac"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID3f96da73-0f0b-4b82-8fee-582f70950c69","label":"HTTP status code 200 is returned","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6c31a150-52db-4ba1-bad6-c374dc60359b","label":"30 seconds timeout","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e32f02f-28f0-4724-8a7b-9323a26ea629","label":"Root element 'feed' exists","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID84104201-71c4-4f32-8291-5f5ac49e6b20","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EID008e0867-010c-45e9-b9f3-1255ff2e74fb"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9","label":"Dataset identifiers","description":"The test case requests the Download Service feed and checks if each dataset has an INSPIRE Spatial Dataset Unique Resource Identifier 'dataset identifier code' and a 'dataset identifier namespace'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 13: Each feed 'entry' in a 'Download Service Feed' shall contain\nspatial_dataset_identifier_code and spatial_dataset_identifier_namespace\nelements which together contain the Spatial Dataset Unique Resource\nIdentifier for the dataset described by the feed. These elements are defined in\nthe inspire_dls schema which shall be included in the namespace declarations\nof the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-dataset-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed dataset identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785","label":"Get Service Feed","description":"Requests the Service Feed and checks the dataset identifiers.","parent":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID342e431e-e031-4057-bb93-4a7d9d858b7d","label":"HTTP status code 200 is returned","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4b4257d8-aee6-406b-8f16-8306c91d1b81","label":"30 seconds timeout","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcbcffce3-745e-490a-bd2f-2d64069409af","label":"Root element 'feed' exists","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9b404f5e-ebed-466b-a5e3-177c3c927f5a","label":"Each entry has an element INSPIRE identifier code","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_code)=0]\",\n  \"TR.missingSpatialDatasetIdentifierCode\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID5c449c08-4578-41ee-a7ea-a168c61005b7","label":"Each entry has an element INSPIRE identifier element namespace","parent":{"ref":"EID65cc6185-5f4b-4b9c-a01a-2b0b1cb4a785"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(inspire_dls:spatial_dataset_identifier_namespace)=0]\",\n  \"TR.missingSpatialDatasetIdentifierNamespace\"\n  \n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID82825850-f358-40d8-913c-5e61cac61fef","label":"HTTP URI","description":"The test case requests the Download Service feed and checks if provides the HTTP URI of the feed as ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 9: The 'id' element of a feed shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-id\" target=\"_blank\">Abstract Test Case 'Download Service feed: id'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID8c63752f-405c-422c-b91e-9b42a76eb720","label":"Get Service Feed","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID52a40318-a6fb-4b29-9064-8903ddf448df","label":"HTTP status code 200 is returned","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4ab0a840-2966-43ae-9ec7-8de9e7e24648","label":"30 seconds timeout","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID43518c24-2fc2-448a-817a-c8e4944baa64","label":"Root element 'feed' exists","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf0d32900-8648-42a9-8e47-0681f34af745","label":"Feed id is an URI","parent":{"ref":"EID8c63752f-405c-422c-b91e-9b42a76eb720"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDc106f883-041b-402d-8ada-33acc7b1d463","label":"Get Service Feed by ID","description":"Requests the Service Feed and checks the feed URL.","parent":{"ref":"EID82825850-f358-40d8-913c-5e61cac61fef"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID32a9b06a-0eee-45a1-9e7a-f69dcaa77471","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89e91ccc-2bfa-4af5-bc5e-286828d46465","label":"30 seconds timeout","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID40f8fcd1-ceb6-4587-bc5c-9a9f9ec8a6a2","label":"Root element 'feed' exists","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID05e473b5-9caa-407d-90e8-49820284df45","label":"Feed ID equals request URL","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID71e5f95e-93c5-4213-a2cb-2bc7b5a3cc1f","label":"Response equals response from test step 'Get Service Feed'","parent":{"ref":"EIDc106f883-041b-402d-8ada-33acc7b1d463"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Service Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Service Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f","label":"Identifiers","description":"The test case requests the Download Service feed and checks if each feed entry provides the HTTP URI of the feed as ATOM ID.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 17: The 'id' element of a feed entry in a Download Service Feed shall contain an\nidentifier for that feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-identifiers\" target=\"_blank\">Abstract Test Case 'Download Service feed identifiers'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180","label":"Get Service Feed","description":"Requests the Service Feed and checks each feed entry ID.","parent":{"ref":"EIDba93c8a4-2c83-40e3-8604-1e38b9a9456f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDdc7f4c35-09cf-4625-9815-71df592f9ab4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2fa4697e-1fe7-45ad-9f4a-c2ae0ebc2864","label":"30 seconds timeout","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDad30bd95-a379-400a-acc3-3cd0afb77c0a","label":"Root element 'feed' exists","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID794b3dfa-4d1b-42ca-878d-93431f397473","label":"Each entry has an id","parent":{"ref":"EID1840a793-e8dd-4cd3-8fe8-dea3a0f24180"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:id)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6359d6da-1e37-423f-b543-018979b665e2","label":"Link to OpenSearch Description document","description":"The test case requests the Download Service feed and checks if it provides a link to an 'OpenSearch Description document' and if the it can be retrieved.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 8: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains a link to an OpenSearch description document for the Download\nService. The value of the 'rel' attribute of this element shall be 'search', the\n'hreflang' attribute shall use the appropriate language code and the value of\nthe 'type' attribute shall be 'application/opensearchdescription+xml'.</li>\n<li>TG Requirement 39: A simple service to perform the Describe Spatial Dataset and Get Spatial Data\nSet operations shall be provided and described by an OpenSearch description\ndocument.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-opensearch-description-document\" target=\"_blank\">Abstract Test Case 'Download Service feed: link OpenSearch Description document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":[{"id":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef","label":"Get Service Feed","description":"Requests the Service Feed and checks OpenSearch description.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbc7cdeff-1374-4515-a92e-6113aef2da61","label":"HTTP status code 200 is returned","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID341a8eae-c6c1-4880-a893-80bd7448fecf","label":"30 seconds timeout","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7398b5e3-efc7-4f0e-9a19-48b560856e15","label":"Root element 'feed' exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68a277ac-f823-4fd1-96cd-6429651777bd","label":"Feed link to OpenSearch Description Document exists","parent":{"ref":"EID27bdfa40-4649-4452-b90a-8d5696cc6eef"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href\",\n\t\"TR.missingOpenSearchDescriptionDocumentLink\"\n);\n\na.isTrue(\n\t\"starts-with(/atom:feed/atom:link[@rel='search' and @type='application/opensearchdescription+xml']/@href, 'http')\",\n\t\"TR.openSearchDescriptionDocumentLinkNotAbsolute\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID342e7d50-b15d-446f-8f83-25807babfb2e","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6998a6f6-66a2-47e5-a70b-503e04415d7c","label":"HTTP status code 200 is returned","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c617c6-c3fe-4567-8173-33c5fa109cd3","label":"30 seconds timeout","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5213157c-3e2a-40fd-9ee9-9557678f0260","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID342e7d50-b15d-446f-8f83-25807babfb2e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EIDe12f3530-1b91-4278-9c5b-5470890835f7","label":"Link to WFS Capabilities document","description":"In case of a 'hybrid implementation' using WFS for implementing direct access: check manually that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\".\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 16: In case of a 'hybrid implementation' based on Atom for Part A of [INS NS,\nAnnex IV] and WFS for Parts B and C of [INS NS, Annex IV], a link shall be\nprovided to the WFS Capabilities document. Where this is done the 'rel'\nattribute shall have the value 'related' and the 'type' attribute shall have the\nvalue 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-wfs-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: link to WFS Capabilities document'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDbb8df909-494c-46d8-ace0-31e18b57b12f"}},"testSteps":{"TestStep":{"id":"EIDf9e282c5-9970-476c-8414-b840effb574a","label":"Get Service Feed","description":"Requests the Service Feed to let the Tester check a link to the WFS Capabilities,  if the same data set is available as a WFS 2.0.0 Direct Access Download Service.","parent":{"ref":"EIDe12f3530-1b91-4278-9c5b-5470890835f7"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe7139814-6e2e-46a0-9840-f5a4966e1fc3","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5d07157-04fd-49a7-abe9-ea9fa99df135","label":"30 seconds timeout","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2e97c6ff-cd40-4841-9e5a-75dd43206104","label":"Root element 'feed' exists","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID1b6abbe5-c210-4935-b480-5f9ef24744a1","label":"Check link to WFS Capabilities document","parent":{"ref":"EIDf9e282c5-9970-476c-8414-b840effb574a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"/atom:feed\",\n\t\"TR.manual.checkLinkToDirectAccessDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92","label":"Links dataset metadata records","description":"The test case requests the Download Service feed and checks if each feed entry has a link to a Dataset metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 14: Each feed 'entry' in a 'Download Service Feed' shall contain a link to a\nDataset metadata record. This link shall have a 'rel' attribute with a value of\n'describedby' and a 'type' attribute with a value 'application/xml'</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-metadata-records\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset metadata records'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID1b3fcafb-e884-4894-994c-60e9ca525c83","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset metadata links are set.","parent":{"ref":"EID5d7ccb56-cc7d-4517-81df-0efb0cca5c92"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID735c1133-f7b2-450d-a76d-2233016fe4b2","label":"HTTP status code 200 is returned","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0edfa98-cf55-4959-9fd2-40a0d7ea2c78","label":"30 seconds timeout","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID006e73e0-f55c-4a0e-bb00-f8a0b67c55bf","label":"Root element 'feed' exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID725bc702-044a-4404-b09e-d001ca93d527","label":"Link to Dataset Metadata record exists","parent":{"ref":"EID1b3fcafb-e884-4894-994c-60e9ca525c83"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:link[@rel='describedby' and @type='application/xml']/@href)=0]\",\n  \"TR.missingLinkToDatasetMetadataRecord\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID11de8ff5-6025-4a1c-939a-f65cda991b16","label":"Rights element","description":"The test case requests the Download Service feed and checks if it has a rights element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 10: The 'rights' element of a feed shall contain information about rights or\nrestrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Download Service feed rights element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d","label":"Get Service Feed","description":"Requests the Service Feed and checks if the it provides rights information.","parent":{"ref":"EID11de8ff5-6025-4a1c-939a-f65cda991b16"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDfc854807-b285-4a38-8aa5-d97cd2044247","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdb8d397e-7760-4c2b-b638-65772e0ccc9e","label":"30 seconds timeout","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa38a26e9-f9de-4f40-aac8-916fc234e34c","label":"Root element 'feed' exists","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e9e0ae5-ed9e-4d50-9a00-7c38bd6601fd","label":"Feed contains rights information","parent":{"ref":"EIDc0e89d68-2fb5-49e6-a001-cfdfe37ac91d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID1756fabf-84f1-47e0-87da-bafd72512291","label":"Self-reference link","description":"The test case requests the Download Service feed and checks if it provides a self-reference link.\n<br/>\n<br/>\n<b>TODO:</b> The ATS states that hreflang should be compared to /atom:feed/atom:title/@xml:lang . This seems inappropriate -at least an additional comparison against /atom:feed/@xml:lang is required.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 7: The 'Download Service Feed' shall contain an Atom 'link' element that\ncontains an HTTP URI for the 'Download Service Feed' document. The value\nof the 'rel' attribute of this element shall be 'self', the 'hreflang' attribute shall\nuse the appropriate language code and the value of the 'type' attribute shall\nbe 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-self-reference-link\" target=\"_blank\">Abstract Test Case 'Download Service feed: self-reference link'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02","label":"Get Service Feed","description":"Requests the Service Feed and checks if the self-refernce link is correct.","parent":{"ref":"EID1756fabf-84f1-47e0-87da-bafd72512291"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0b0380eb-e5be-47d2-844a-8c4c766e8cee","label":"HTTP status code 200 is returned","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd0f601f2-18e6-4480-a57e-2c0756bd4b79","label":"30 seconds timeout","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfec3dd1f-b041-4127-a910-21fcb7bde22a","label":"Root element 'feed' exists","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ce5a9ab-ca95-470e-8927-d52b82092e69","label":"Self reference equals the Download Service feed URI","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml']/@href\",\n  \"/atom:feed/atom:link with @rel='self'\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID544cf934-0fe3-4865-88b5-5e12285a393f","label":"Self link has proper language references","parent":{"ref":"EIDcfb4cf5f-e35c-490c-bcd4-b740bd221c02"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nString languages = context.expand( '${OpenSearch Description link exists#openSearchLanguages}' )\nlog.info(\"Language: \"+languages)\n\na.exists(\n  \"/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and (@hreflang=/atom:feed/@xml:lang or @hreflang=/atom:feed/atom:title/@xml:lang or contains('\"+languages+\"', @hreflang))]\",\n  \"TR.incorrectFeedSelfReferenceLang\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0","label":"Title","description":"The test case requests the Download Service feed and checks if it each entry has a title.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 18: The 'title' element of a feed entry in a Download Service Feed shall be\npopulated with a human readable title for the feed entry.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-titles\" target=\"_blank\">Abstract Test Case 'Download Service feed: entry titles'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID247f8881-c8e2-462d-a999-96144faee1f3","label":"Get Service Feed","description":"Requests the Service Feed and checks if the title is set for each feed entry.","parent":{"ref":"EID4675f14c-ae5a-4fde-8c41-9d6b9be5cac0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID526d5b82-8ec4-4823-ad22-92e52bcc063e","label":"HTTP status code 200 is returned","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc47d84e2-2b36-4260-abdc-4341b2e5ec51","label":"30 seconds timeout","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID545cc87f-3d0f-4e4d-9378-38476dc21cc7","label":"Root element 'feed' exists","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0af8c7c0-4fac-49df-b817-86b11bb9f69e","label":"Each entry has a title","parent":{"ref":"EID247f8881-c8e2-462d-a999-96144faee1f3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[string-length(atom:title)=0]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9f5a4899-7076-4aae-b859-6881f870bc41","label":"Updated feed element date","description":"The test case requests the Download Service feed and checks if each feed entry provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 19: The 'updated' element of a feed entry in a Download Service Feed shall\ncontain the date, time and timezone at which the feed entry was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element-date\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element date'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5","label":"Get Service Feed","description":"Requests the Service Feed and checks if provides update information.","parent":{"ref":"EID9f5a4899-7076-4aae-b859-6881f870bc41"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID81652ee1-8d6a-4bd7-b73c-7ce6643f4fb1","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDef9d4618-e673-44c8-baf3-1b4cffe84e9f","label":"30 seconds timeout","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbeab8fb-c972-4cd3-8de1-663d96d54a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID44374564-e394-4c06-b685-46c9369e29d1","label":"Each entry has an element updated","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[year-from-dateTime(xs:dateTime(atom:updated)) <=0]\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0c0bf78b-b1e9-46d8-9869-dd3529d51884","label":"Date is not before the year 2012","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDafc0153c-5f03-4e66-b0d6-4f866a13fcbb","label":"Date is not in the future","parent":{"ref":"EIDf590f109-ddde-4c22-8f11-1beedc7628d5"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b","label":"Updated element","description":"The test case requests the Download Service feed and checks if it provides a 'updated' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 11: The 'updated' element of a feed shall contain the date, time and timezone at\nwhich the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Download Service feed updated element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a","label":"Get Service Feed","description":"Requests the Service Feed and checks if each title has an element 'updated'.","parent":{"ref":"EID59e31b8c-2277-4491-b38b-9b067fd88f9b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID1a696ecb-91f0-4291-992d-d50309f756c9","label":"HTTP status code 200 is returned","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe568e2ef-2bf6-4f33-a532-0a8109262273","label":"30 seconds timeout","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID97f57414-5b41-465a-95b0-596c884bc25a","label":"Root element 'feed' exists","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf8c029e9-6cb9-4b9a-9477-255e4e130ff2","label":"Feed contains updated information","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID94ae8e41-ca18-4c83-87d8-81de55891d86","label":"Date is not before the year 2012","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID68cf959b-8629-4c39-89f2-1988e0fa5487","label":"Date is not in the future","parent":{"ref":"EID236bb0dd-3eda-46cd-83c4-7cc7f2fd5b3a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c","label":"Provide a title element","description":"The test case requests the Download Service feed and checks if it provides a 'title' element.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 5: The 'title' element of an Atom feed shall be populated with a human readable\ntitle for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-title\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide a title element'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f","label":"Get Service Feed","description":"Requests the Service Feed and checks if it provides a title.","parent":{"ref":"EID4abfa6f3-4dd7-4a6e-8a07-c172ecf0ed3c"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID816b487c-0309-416b-a9b0-2cf5ed326e08","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4caf026b-3e5e-4dfc-8a35-502c2a0d8c0f","label":"30 seconds timeout","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8aaec96a-4930-40b4-a515-51a2cd999a8d","label":"Root element 'feed' exists","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9e5db714-8cae-4709-8efd-c793aca80c4c","label":"Feed has a title","parent":{"ref":"EIDc5359a5b-67d8-4b76-aa50-1db7b317029f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:title\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4","label":"Separate entries per dataset","description":"The test case requests the Download Service feed and checks that each each dataset has a separate entry in the service feed.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 1: Pre-defined Dataset Download Service implementations shall publish separate\ndatasets as individual entries within an Atom feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-entry-per-dataset\" target=\"_blank\">Abstract Test Case 'Download service feed: separate entries per dataset'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"dependencies":{"testCase":{"ref":"EIDf3bbb312-6c4a-423a-80cc-0dcce1e9a5c9"}},"testSteps":{"TestStep":{"id":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872","label":"Get Service Feed","description":"Requests the Service Feed and checks that each each dataset has a separate entry in the service feed.","parent":{"ref":"EID3b1cf94e-b83c-4c56-9ba5-2bd801010ea4"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDbdbe3b9d-e494-4266-ae6d-b2c20457ab73","label":"HTTP status code 200 is returned","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0eeaa26-2b57-4570-a892-40ca0d642d10","label":"30 seconds timeout","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID6e15e5c8-d02f-4e2e-b88d-776004dd6ef0","label":"Root element 'feed' exists","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb18b17b8-8e7f-4df0-9b8c-ce9ac27b4405","label":"Dataset identifiers (spatial_dataset_identifier_namespace + spatial_dataset_identifier_code combination) are unique","parent":{"ref":"EID061da0c4-6109-4cff-ba9a-3e4f4eeba872"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValues(\n\t\"count(//*:entry[*:spatial_dataset_identifier_code = following-sibling::*/*:spatial_dataset_identifier_code and \"+\n\t\"*:spatial_dataset_identifier_namespace = following-sibling::*/*:spatial_dataset_identifier_namespace])\",\n\t\"0\",\n\t\"TR.uniqueDatasetIdentifiers\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID4546bada-0307-42ec-883b-25494233e9a5","label":"Links dataset feed","description":"The test case requests the Download Service feed and checks if each feed entry contains exactly one dataset feed link with a 'rel' attribute with the value 'alternate' and a 'type' attribute with the 'value' 'application/atom+xml'.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 15: Each feed 'entry' in a 'Download Service Feed' shall contain a single link to a\n'Dataset Feed'. This link shall have a 'rel' attribute with a value of 'alternate'\nand a 'type' attribute with a value 'application/atom+xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-links-dataset-feed\" target=\"_blank\">Abstract Test Case 'Download Service feed links dataset feed'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":{"id":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17","label":"Get Service Feed","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID33789d28-70d9-49eb-be72-66ea2805a04e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe50f5512-6bbb-48c5-a298-9e89a65270dc","label":"30 seconds timeout","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbf1d2fe5-b910-4765-8631-b27b1cd16200","label":"Root element 'feed' exists","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDbdd67613-ea66-4e61-a9c5-3bcfb6430d42","label":"Each entry has exactly one Dataset Feed link","parent":{"ref":"EIDdafcef94-9aa0-44aa-815b-5966d1813b17"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed/atom:entry[count(atom:link[@rel='alternate' and @type='application/atom+xml'])!=1]\",\n  \"TR.invalidDatasetFeedLinks\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb0be137f-b987-4050-9991-9939c14558fc","label":"Provide link to metadata record for download service","description":"The test case requests the Download Service feed and checks if it provides a link to a metadata record.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 6: The 'Download Service Feed' shall contain an Atom 'link' element that links to\nthe metadata record for this Download Service. The value of the 'rel' attribute\nof this element shall be 'describedby' and the value of the 'type' attribute shall\nbe either 'application/xml'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/download-service-feed-link-to-metadata-record\" target=\"_blank\">Abstract Test Case 'Download service feed: Provide link to metadata record for the download service'</a>","parent":{"ref":"EID59c49d09-616a-4a70-a918-2f31d345e38f"},"testSteps":{"TestStep":[{"id":"EID62c56e18-3a6f-4c85-befc-56f47c597583","label":"Get Service Feed","description":"Requests the Service Feed and checks that the  metadata record for the download service exists.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID51637bcb-84c0-43de-a410-39cfe7214d42","label":"HTTP status code 200 is returned","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID314faeb2-54f4-4cf8-b096-2c8ebab24f95","label":"30 seconds timeout","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID77ef7c73-a8e2-4d40-b296-0f88e45b239f","label":"Root element 'feed' exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa0e0a10e-dd0e-4d2a-99af-1380b78c632e","label":"Link to metadata record for the download service exists","parent":{"ref":"EID62c56e18-3a6f-4c85-befc-56f47c597583"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']\",\n  \"TR.missingLinkToMetadataRecordForDownloadService\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09","label":"Get Metadata Record","description":"Requests the  metadata record from the Service Feed.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc94062c4-1c8b-485d-8ddc-ccf5c342bc6a","label":"HTTP status code 200 is returned","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3b6a24fe-a470-4fb1-829c-52baad1dba5d","label":"30 seconds timeout","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID234062a4-45c2-4013-9038-71b8cc9a7d36","label":"Root element 'MD_Metadata' exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"exists(/gmd:MD_Metadata) or ( count(/*) = 1 and exists(/*/gmd:MD_Metadata) )\", \n\t\"TR.missingMDMetadataRootElement\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7e59dfea-4fb9-404d-a382-0fb3a0038862","label":"Resource Locator exists","parent":{"ref":"EID6a7c69f4-362d-4ea1-8992-19f8f0392b09"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//gmd:distributionInfo/*/gmd:transferOptions/*/gmd:onLine/*/gmd:linkage/gmd:URL\",\n  \"TR.missingLinkageResourceLocator\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID72da1012-15a7-43d6-98d7-d734ec85b613","label":"Get Service Feed from Resource Locator","description":"Requests the document from the Resource Locator and compares the describedby link from the 'Get Service Feed' step with the describedby link from this response.","parent":{"ref":"EIDb0be137f-b987-4050-9991-9939c14558fc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID0a21f0ad-a0b9-4d69-a258-51b0555add42","label":"HTTP status code 200 is returned","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID0600ff93-ca28-4e15-aeda-2e5ff799aadf","label":"30 seconds timeout","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID56c9a2f1-63ec-4664-8791-fa8b1c231df9","label":"Root element 'feed' exists","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd38c5dbf-c4ef-4c7e-93e3-4592b895e41c","label":"The describedby link from the first response equals the describedby from this response","parent":{"ref":"EID72da1012-15a7-43d6-98d7-d734ec85b613"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equalPathValuesInStep(\n  \"/*:feed/*:link[@rel='describedby' and @type='application/xml' or @type='application/vnd.ogc.csw.GetRecordByIdResponse_xml']/@href\",\n  \"Get Service Feed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}},{"id":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337","label":"Dataset Feed","description":"Test module for checking the Dataset Feeds that are referenced by the Download Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964","label":"Check all Feed entries","description":"Technical Test Case which iterates over all Dataset feed entries in the Download Service Feed. This test case requires the Test Case 'Links dataset feed' in the 'Download Service Feed' Test Suite to pass.","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EID4546bada-0307-42ec-883b-25494233e9a5"}},"testSteps":{"TestStep":[{"id":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e","label":"Get Service Feed","description":"Requests the Service Feed and checks the contact information.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e59dda7-5894-467a-8898-aab1452b2ca8","label":"HTTP status code 200 is returned","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d5ee48b-e87f-4c0c-92da-f34bed36185c","label":"30 seconds timeout","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDaeb0ef4a-6785-4e05-867a-a582eebea1f6","label":"Root element 'feed' exists","parent":{"ref":"EID58b7f026-abf7-4aa2-8352-b12bba979e8e"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID6cda6835-bf50-4a54-945f-de1cb4f4df90","label":"Check all feed entries","description":"Iterate over all Feed entries.","parent":{"ref":"EID79c5ab9a-fc31-4ecb-8161-4f01fdc7b964"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\n\nProjectHelper ph = new ProjectHelper();\ndef serviceFeedXmlHolder = ph.getTransferPropertyAsXml(\"serviceFeedXml\")\n\ndef feedEntryURLs = serviceFeedXmlHolder.getNodeValues(\"/*:feed/*:entry/*:link[@rel='alternate' and @type='application/atom+xml']/@*:href\");\nlog.info(\"feedEntryURLs: \" + feedEntryURLs);\n\n// clear url to test\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",\"\")\n\n// Check all except the last one\nfor(int i=0; i<feedEntryURLs.size()-1; i++) {\n\tfinal String feedEntryURL = feedEntryURLs[i]\n\tlog.info(\"Checking URL: \" + feedEntryURL)\n\ttestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURL)\n}\n\nlog.info(\"Checking URL: \" + feedEntryURLs.last())\ntestRunner.testCase.testSuite.setPropertyValue(\"feedEntryURL\",feedEntryURLs.last())","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}}]}},{"id":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b","label":"Contact information","description":"Checks that the feed provides contact information about the individual or organisation responsible for the feed. The author name and email address must be provided.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 25: The 'author' element of a 'Dataset Feed' shall contain current contact information for an individual or organisation responsible for the feed. At the minimum, a name and email address shall be provided as contact information.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-contact-information\" target=\"_blank\">Abstract Test Case 'Dataset feed contact information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDce5a6d78-3a71-4ded-8b2e-fcc4d71d6849"}},"testSteps":{"TestStep":{"id":"EIDed487595-c12b-42bb-9251-842d352f151b","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5cfc2aa9-1e9d-4e1d-a494-49e80907620b"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDe057985c-82b5-4f78-ba3a-14f5ec7a0e48","label":"HTTP status code 200 is returned","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID42507c13-e6d6-4919-93b4-407ad56671b9","label":"30 seconds timeout","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7b7e68a2-367c-4164-83e7-493f2855b1ad","label":"Root element 'feed' exists","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf2f63ec7-376e-4a0c-a2fe-6595c3d9592b","label":"Feed contains author","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:name\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3416904-5bc6-45f4-a331-0abf7f0b87fa","label":"Feed contains author email","parent":{"ref":"EIDed487595-c12b-42bb-9251-842d352f151b"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:author/atom:email\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc","label":"HTTP URI","description":"Checks that dataset feed provides the HTTP URI of the feed as feed id.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 22: The 'id' element of a 'Dataset Feed' shall contain an HTTP URI which dereferences to the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-id\" target=\"_blank\">Abstract Test Case 'Dataset feed HTTP URI'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDed94db52-6a1d-4103-8645-2128cd464847","label":"30 seconds timeout","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5bf2efd6-136a-4a17-bb8c-ae862a731fbd","label":"HTTP status code is 200","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc6c5b1fb-fb8d-4031-876f-e56f61ec96f4","label":"Feed id is an URI","parent":{"ref":"EID2aa9841c-d552-45fe-b35a-d4b1659a3855"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"/atom:feed[substring(atom:id,1,4)!='http']\",\n  \"TR.idNotAnURI\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDa6112087-5531-41d1-bfb0-8515d76785cc","label":"Get Dataset Feed by ID","description":null,"parent":{"ref":"EID34ccb113-ed5a-40fc-bd4c-1f8c53b447cc"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID96b34215-995a-4f6c-b5b3-5d0c38e02647","label":"HTTP status code is 200","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1344e9c6-84c8-4e25-a9fb-9bb384a6f9a0","label":"30 seconds timeout","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8da901fc-2e5f-4b3a-ad5c-dfa6ce85da6a","label":"Root element 'feed' exists","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID9ea79d5a-86ed-4dde-85e6-ab0acf6bbb8a","label":"Feed ID equals request URL","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/atom:feed/atom:id\",\n  \"/atom:feed/atom:id\",\n  messageExchange.getEndpoint(),\n  \"TR.feedIdDoesNotReferToEndpoint\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID568e315d-81c7-426d-8e06-d90ada499d9c","label":"Response equals response from test step 'Get Dataset Feed'","parent":{"ref":"EIDa6112087-5531-41d1-bfb0-8515d76785cc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\ndef response = context.expand( '${Get Dataset Feed#Response}' )\n\nif( response.toString() != messageExchange.getResponseContent().toString() ) {\n\tthrow new TranslatableAssertionError(\"TR.responseNotEqual\", \"testStep\", \"Get Dataset Feed\");\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID5c0ebf08-068d-4973-87b5-0290707fedbf","label":"Download dataset link","description":"Test if at least one feed entry is available with at least one link to download a file.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 26: Each 'Dataset Feed' shall contain at least one feed entry containing links to download the pre-defined dataset (e.g. as a GML file).</li>\n<li>TG Requirement 29: Each feed entry shall contain an Atom 'link' element that links to the pre- defined dataset file described by the entry. The value of the 'rel' attribute of this element shall be 'alternate' and a 'length' attribute (providing the length of the linked resource in octets) shall be provided if possible. Where a dataset is provided in multiple physical files, additional 'link' elements shall be provided in the feed entry, one link for each physical file.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-download-dataset\" target=\"_blank\">Abstract Test Case 'Link download dataset'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd40a2381-4226-4c44-9b39-f31aa7080c68","label":"Feed title exists","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb69b2305-f8e9-48a5-9dde-1795f5bf7de9","label":"30 seconds timeout","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3bb3fe48-5cc6-46c2-bb42-94ea3d263aed","label":"HTTP status code is 200","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa4ab80d7-03f1-4607-aba7-3fdc48a5d084","label":"At least one feed entry is available with at least one link to download a file","parent":{"ref":"EID013a9576-bdf0-4f2c-8521-6e50e3a10ab3"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' ) or (@rel='section')]/@href\",\n  \"TR.missingOneFeedEntryWithDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d","label":"Get file","description":null,"parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf99befdc-93e5-4089-8926-af36a5a35494","label":"30 seconds timeout","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3345203-a8f6-4db5-bf12-814533a4625d","label":"HTTP status code is 200, 204, 301, 302 or 303","parent":{"ref":"EID004bc31a-bb94-4a8b-a741-1d9a9000e54d"},"expectedResult":"exist","expression":"200, 204, 301, 302, 303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}]}},{"id":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f","label":"Get Dataset Feed and check optional length attributes","description":"A link \"length\" attribute (providing the length of the linked resource in octets *) must be provided if possible.","parent":{"ref":"EID5c0ebf08-068d-4973-87b5-0290707fedbf"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID6d506ce6-087f-451b-94ce-7d58a8edae2f","label":"Feed title exists","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID505e624d-ec6b-48a5-a0f6-925c25cf1452","label":"30 seconds timeout","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1a1bd393-4cdd-4204-aa58-445458503c79","label":"HTTP status code is 200","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf6549364-26ac-4a4a-8f6e-78588a6d68eb","label":"Download link has length attribute","parent":{"ref":"EIDf518a901-93c1-4613-a6c1-b41d6faf0a5f"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')]/@href\",\n  \"TR.manual.checkLengthOfDlFile\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea","label":"Rights element","description":"Check that the feed's rights element exists.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 23: The 'rights' element of a 'Dataset Feed' shall contain information about rights or restrictions for that feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-rights-element\" target=\"_blank\">Abstract Test Case 'Rights element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID77a041d1-0eb0-46f0-8d57-08f5283556ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcd901e00-008b-42d5-bbae-cf0793bcf243","label":"30 seconds timeout","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc370ce35-d06c-42a3-8875-fbe4555a9296","label":"HTTP status code is 200","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb1ff6b41-ee24-47e8-aad5-693419310aa4","label":"Feed contains rights information","parent":{"ref":"EIDfb0b0344-5d6b-4293-8839-b249ddc9fbee"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/atom:feed/atom:rights\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6","label":"Title","description":"Check that the feed's title is non-empty text.\n<br/>\n<br/>\n<b>Known limitations: </b> The ATS states that the test case needs to check wheter the value is 'alphanumeric'. This is inappropriate, since the value can contain characters that are not in the range of A-Z,a-z and 0-9, for instance text strings in greek.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 21: The 'title' element of a 'Dataset Feed' shall be populated with a human readable title for the feed.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-title\" target=\"_blank\">Abstract Test Case 'Title'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDbab92e23-e681-41e9-980f-59794067365d","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID9d8b99ed-1360-4d01-ad39-4b167f8dcca6"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID957ff43d-aaee-449a-9c05-ae93e373cfc1","label":"30 seconds timeout","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID446b58f4-85b6-4892-aad0-9c2f7939a82d","label":"HTTP status code is 200","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID267fb057-fd3c-4cd8-bc35-19cc199575cf","label":"Feed title exists","parent":{"ref":"EIDbab92e23-e681-41e9-980f-59794067365d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.existsNonEmptyText(\"/atom:feed/atom:title\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID0218d717-6b00-460d-94cc-48039accb6ea","label":"Updated element","description":"Check if the updated element provides a valid date. The date must not be in the future or before the year 2012.\n\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 24: The 'updated' element of a 'Dataset Feed' shall contain the date, time and timezone at which the feed was last updated.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-updated-element\" target=\"_blank\">Abstract Test Case 'Updated element'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0218d717-6b00-460d-94cc-48039accb6ea"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDad8d88cd-6673-4ab1-ad28-a320bc7e2d74","label":"30 seconds timeout","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1690699e-6bcd-4c07-bd29-aced03506d36","label":"HTTP status code is 200","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe785106d-a4fe-448f-8167-9eeb514661e7","label":"Updated element exists","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n  \"year-from-dateTime(xs:dateTime(/atom:feed/atom:updated)) > 0\",\n  \"TR.missingFeedUpdatedInformation\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDefdd906b-d2f5-435e-a7b9-4a0ae838388f","label":"Date is not before the year 2012","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isFalse(\n  \"//atom:entry/atom:updated/year-from-dateTime( xs:dateTime( . ) ) < 2012\",\n  \"TR.dateIsBefore2012\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca40e458-362b-440c-a992-6efabf463339","label":"Date is not in the future","parent":{"ref":"EID7d57ba11-1df9-4bb2-aa77-440a313392fd"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.TimeUtils;\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String now = TimeUtils.dateToIsoString( new Date() )\n\na.isFalse(\n  \"//atom:entry/atom:updated/xs:dateTime(.) > xs:dateTime('\"+now+\"')\",\n  \"TR.dateIsInTheFuture\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5","label":"Each entry has CRS information","description":"Check that each entry in the Dataset feed one valid category element is provided for the CRS.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 35: Each CRS representation shall have a 'category' element which refers to the CRS definition and code.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-crs\" target=\"_blank\">Abstract Test Case 'Each entry has CRS information'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EIDb84cb78c-b67f-451a-a4b3-510178c03621","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID8d0d9cdd-efca-42e8-ad1f-7eb66aa638d5"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID5686bf92-0937-43f9-894c-a6fbfcce14d9","label":"30 seconds timeout","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3f955f5f-aa23-4e9c-b2b6-ced8d7e6a5ef","label":"HTTP status code is 200","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDc5baa617-99df-453c-89d5-889050c29330","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EIDb84cb78c-b67f-451a-a4b3-510178c03621"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23","label":"Language for download link","description":"Check that each entry which has more than one download link provides the hreflang attribute to indicate the language of the target dataset.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 31: Where alternative language representations of datasets are linked to, the 'hreflang' attribute of the link element shall be used to indicate the language of the target dataset as described in the Atom specification.</li>\n<li>TG Requirement 38: Where a feed is made available in alternative languages, links shall be provided to these alternative representations. These links shall each use the 'hreflang' attribute to indicate the language of the alternative representation. The value of the 'rel' attribute for these link elements this element shall be 'alternate'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-dataset-language\" target=\"_blank\">Abstract Test Case 'Language for download link'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID207c5c35-db32-41ba-879e-1e808b7489c6","label":"Get Dataset Feed","description":null,"parent":{"ref":"EIDb2a3b021-7992-4db1-ae8a-f4b214e54a23"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7e4fda51-4006-4f3e-a6f4-7db68392fc11","label":"30 seconds timeout","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID49422432-0c1b-4af3-bfa2-251d5ae79228","label":"HTTP status code is 200","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf0a33a4d-c92f-4baf-85cb-b4abbc0ba1ce","label":"If an entry has more than 1 download link, test that each of these download links provides the hreflang attribute","parent":{"ref":"EID207c5c35-db32-41ba-879e-1e808b7489c6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.isTrue(\n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])=1 or \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')]/@hreflang) = \"+ \n  \"count(//*:entry/*:link[(@rel='alternate' and @type!='application/atom+xml') or (@rel='section')])\",\n  \"TR.missingLanguageForDownloadLink\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID55c069c6-94a5-4651-9af9-8246cc146022","label":"Links for Spatial Object Types","description":"Test if the dataset feed contains at least one link to a registry\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 28: Each feed shall contain an Atom 'link' element for each INSPIRE Spatial Object Type in the dataset. The link shall refer to the INSPIRE Registry unless the data does not conform to any Data Specification in which case a link to a local definition of the Spatial Object Type shall be used instead. The value of the 'rel' attribute of this element shall be 'describedby'. For definitions in the\nINSPIRE registry the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-links-spatial-object-types\" target=\"_blank\">Abstract Test Case 'Links for Spatial Object Types'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID7b0a0bbe-f703-489c-8693-efcaf6161199","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID55c069c6-94a5-4651-9af9-8246cc146022"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID76133e1d-5614-401d-852e-4ef8815a1cef","label":"HTTP status code is 200","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDabd27331-1785-46d9-86f2-d2139848a4c7","label":"30 seconds timeout","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf8519e33-7b0f-41c1-8b4f-1c2ba30b2a17","label":"Root element 'feed' exists","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd82ba567-ee3b-4df4-be82-dc754c146e97","label":"Test if the dataset feed contains at least one link to a registry","parent":{"ref":"EID7b0a0bbe-f703-489c-8693-efcaf6161199"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']\", \n\t\"TR.missingLinkToRegistry\"\n);\n\na.existsNonEmptyText(\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\",\n\t\"/atom:feed/atom:link[@rel='describedby' and @type='text/html']/@href\", \n\t\"TR.missingLinkToRegistry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID59246a83-610b-4a03-9864-c882200e24ab","label":"Multiple links for multiple physical files","description":"Test for dataset which are provided in multiple physical files, that each file is linked via a separate link element. Each of these link elements shall have a \"rel\" value equal to \"section\".\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 32: Where a dataset is provided in multiple physical files: each file shall be linked to via a separate 'link' element. Each of these 'link' elements shall have a 'rel' value equal to 'section'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files\" target=\"_blank\">Abstract Test Case 'Multiple links for multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID59246a83-610b-4a03-9864-c882200e24ab"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDf1af7b9e-1d16-4c06-8661-46de0db09a2b","label":"HTTP status code is 200","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbc6c6c4-09ef-47de-afe4-7fcea6ee8422","label":"30 seconds timeout","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID63eeee36-af99-4c6b-8afb-470859d16828","label":"Root element 'feed' exists","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3c96db82-a589-4a37-bcfd-73164aa74438","label":"Number of section links must not be exactly 1","parent":{"ref":"EID34caf1a6-eb2a-449d-9fb0-713f1dc1cabc"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.notExists(\n\t\"//*:entry[count(./*:link[@rel='section']) eq 1]\",\n\t\"TR.multipleLinksForMultipleFilesExpected\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0","label":"Separate entries for each format/CRS combination","description":"Test that the Dataset Feed contains separate entries for each format/CRS combination in which the pre-defined dataset is made available for download.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 27: Each 'Dataset Feed' shall contain separate entries for each format/CRS combination in which the pre-defined dataset is available to download.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-entries\" target=\"_blank\">Abstract Test Case 'Separate entries for each format/CRS combination'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"dependencies":{"testCase":{"ref":"EIDb87b5132-cb6c-44cb-9215-e588fc1e3344"}},"testSteps":{"TestStep":[{"id":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a","label":"Get Service Feed","description":"Requests the Service Feed and checks the CRS information.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd70a53f2-2100-4d59-b44a-2e26834d370e","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID755b16af-dd85-46d3-8215-9cd4a75b6e6f","label":"30 seconds timeout","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDd7cfd878-1d91-4cf2-88b7-2f353a6cef78","label":"Root element 'feed' exists","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDca90b1e6-1fba-41f6-a573-07f914e4d335","label":"Each entry has an element category, including a term and label, to refer to CRSs.","parent":{"ref":"EIDc2cdbb58-dbd6-4d34-a2a8-a6ae9b81320a"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15","label":"Get Dataset Feed","description":"Requests the Dataset Feed and checks the CRS and alternate link combinations.","parent":{"ref":"EID6e6a47ed-d7b8-406a-9cd5-e1abf4652cf0"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa2fd9611-3fc5-4fb3-a708-e5400fd2b9c0","label":"30 seconds timeout","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID03b95227-e284-4279-87f2-9928c6a4eccc","label":"HTTP status code is 200","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID450d4218-9461-496d-aa2f-33a2b3b8389b","label":"Root element 'feed' exists","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":null,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc15a6218-8819-40b8-a364-eb9720a3838b","label":"Exactly one category per entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(atom:category[@term])>1])\",\n\t\"//atom:entry[count(atom:category[@term])>1]\",\n\t\"0\",\n\t\"TR.exactlyOneCategoryPerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDacf3709f-6fc4-4d4c-b025-2b49f702bbc5","label":"Exactly one alternate link type per Dataset feed entry","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.equals(\n\t\"count(//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1])\",\n\t\"//atom:entry[count(distinct-values(atom:link[@rel='alternate']/@type))>1]\",\n\t\"0\",\n\t\"TR.exactlyOneAlternateLinkTypePerEntry\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID81bdd847-687d-4597-ba58-99963ff3635a","label":"Alternate link types and CRS combinations are unique","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"<etfTranslate what='TR.uniqueAlternateLinkTypes'/>","expression":"<etfTranslate what='TR.uniqueAlternateLinkTypes'>\n{\n\n    let $sortedValues := for $entry in //*:entry\n    order by $entry/*:category[1]/@term, $entry/*:link[@rel = 'alternate'][1]/@type\n    return concat('CRS ', $entry/*:category[1]/@term, ' with type ', $entry/*:link[@rel = 'alternate'][1]/@type, '   ')\n    \n    let $duplicates := $sortedValues[let $pos := position() return . = $sortedValues[$pos+1]]\n    let $duplicateCount := count( $duplicates )\n    let $distinctDuplicates := distinct-values( $duplicates )\n    \n    return if ($duplicateCount > 0) then \n        (<count> { $duplicateCount } </count>,<duplicates> { $distinctDuplicates } </duplicates>) \n        else ()\n\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe118dccc-6f1b-4376-a577-7e8ae13cd41e","label":"Category terms in this Dataset feed exist in the Download Service Feed","parent":{"ref":"EID76d165b9-d41b-45eb-b7e6-27fc900f7f15"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\nfinal String terms = context.expand( '${Transfer_Properties#categories}' );\nlog.info(\"Download Service Feed terms: \"+terms);\n\na.notExists(\n\t\"//atom:entry/atom:category[string-length(@term)>0 and string-length(@label)>0 and not(contains('\"+terms+\"', @term))]\",\n\t\"TR.atLeastOneCategoryNotInServiceFeed\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f","label":"Use INSPIRE media-types only","description":"Test that only media types listed in the INSPIRE media-types register are used.\n<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 30: The 'type' attribute of the link element shall be used to indicate the media type of resource that will be returned if the link is resolved. A valid media type must be used for the value of this attribute; if the media type is not registered with IANA it should still follow the conventions for unregistered media types.</li>\n<li>TG Requirement 34: Only media types listed in the INSPIRE media-types register shall be used.</li>\n\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-link-media-type\" target=\"_blank\">Abstract Test Case 'Use INSPIRE media-types only'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2","label":"Get INSPIRE Media Types","description":"Get the list of INSPIRE media types from https://inspire.ec.europa.eu/media-types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc947b341-320a-4f0b-96aa-3a351ee25a10","label":"30 seconds timeout","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3c9511c-4101-4915-81b9-aba6e2072815","label":"HTTP status code is 200","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID44852025-6fca-456f-acf1-95e7c7f2dd8a","label":"Root element 'feed' exists","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID3df8c60f-a520-4f3a-afa0-1446c757112c","label":"ID is INSPIRE media types","parent":{"ref":"EID8ef21a6b-902d-4585-ae34-e5af27262ef2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\n\t\"/atom:feed/atom:id[contains(., '://inspire.ec.europa.eu/media-types')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID0b46fce1-085e-4564-b97c-dce9ed762b8f","label":"Iterate over Media Type entries","description":null,"parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Types\")\n\ndef mediaTypeUrls = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:link[@rel='self']/@href\" );\ndef mediaBaseTypes = xmlHolder.getNodeValues( \"/*:feed/*:entry/*:title\" );\nlog.info(\"mediaTypeUrls: \" + mediaTypeUrls);\n\n// clear url to test\nph.setTransferProperty(\"mediaTypeUrl\", \"\")\nph.setTransferProperty(\"mediaTypes\", \"\")\n\nfor(int i=0; i < mediaTypeUrls.size(); i++) {\n\tfinal String url = mediaTypeUrls[i];\n\tfinal String baseType = mediaBaseTypes[i];\n\n\tlog.info(\"Using URL: \"+url)\n\tph.setTransferProperty(\"mediaTypeUrl\", url)\n\tph.runTestStep(\"Get INSPIRE Media Subtype\");\n\tdef respXmlHolder = ph.getTestStepResult(\"Get INSPIRE Media Subtype\")\n\tdef extractedMediaTypes = respXmlHolder.getNodeValue( \"string-join(/*:feed/*:entry/*:title, '')\" );\n\tfinal String mediaTypes = ph.getTransferProperty(\"mediaTypes\")\n\tif(mediaTypes!=\"\") {\n\t\tph.setTransferProperty(\"mediaTypes\", mediaTypes+\" \"+extractedMediaTypes)\n\t}else{\n\t\tph.setTransferProperty(\"mediaTypes\", extractedMediaTypes)\n\t}\n}\n\nph.disableTestSteps([\"Get INSPIRE Media Subtype\"]);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID0531fe14-2169-4a9e-a1da-30040ea73277","label":"Get INSPIRE Media Subtype","description":"Get the list of INSPIRE media sub types with 'Accept'-Header 'application/atom+xml'","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID7b4d43eb-cfbd-47b2-aeae-9d1fc802d78d","label":"30 seconds timeout","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID7389eee5-84b7-4333-8848-9f5b394c9d67","label":"HTTP status code is 200","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75bb53c4-17e8-4cb4-b6c6-72a5c6cc1819","label":"Root element 'feed' exists","parent":{"ref":"EID0531fe14-2169-4a9e-a1da-30040ea73277"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c","label":"Get Dataset Feed","description":"Get the Dataset Feed and check if it contains valid INSPIRE media types","parent":{"ref":"EID7e03feba-57eb-4ca1-bb30-1c265f65a03f"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb6a56e5f-482f-4b20-85d3-6b052872f9d4","label":"HTTP status code is 200","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf2e49918-0cf7-4e6d-8c6c-941ef3f85113","label":"30 seconds timeout","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9bc2521f-a127-45d6-aaaa-18f9b623ab84","label":"Root element 'feed' exists","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb88e3063-f589-47ef-8ef3-18a87d85c4f6","label":"Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used","parent":{"ref":"EIDaf1e117e-aac8-4ada-8750-6eaee997df3c"},"expectedResult":"<etfTranslate what=\"TR.notAnInspireMediaType\"/>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<etfTranslate what=\"TR.notAnInspireMediaType\">\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\n(<links>$entry/atom:link[@rel='alternate']/@href</links>,\n<ids>$entry/atom:id</ids>,\n<types>$entry/atom:link[@rel='alternate']/@type</types>)\n}\n</etfTranslate>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}}]}},{"id":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993","label":"Provide guidance for downloading multiple physical files","description":"Test that a description of the dataset structure is provided either in an atom \"content\" element as free text, or in an external document which is the target of another \"link\" element where a dataset is provided in multiple physical files.<br/>\n<br/>\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 33: Where a dataset is provided in multiple physical files: a description of the dataset structure shall be provided EITHER in an atom 'content' element as free text, OR in an external document which is the target of another 'link' element. Where a 'link' element is used this element shall have a 'rel' value equal to 'alternate' and a suitable media type shall be used for the 'type' value.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-atom/3.1/atom-pre-defined/dataset-feed-multiple-files-description\" target=\"_blank\">Abstract Test Case 'Provide guidance for downloading multiple physical files'</a>","parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":{"id":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856","label":"Get Dataset Feed","description":null,"parent":{"ref":"EID0eac5cf6-1464-47d2-acfe-ff4ad8290993"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID10178b9c-8e01-498c-8975-2d49fff98a21","label":"HTTP status code is 200","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID15995736-59e8-4c5e-ba0a-bb0c23659a96","label":"30 seconds timeout","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID1d15c470-afac-43ee-a42f-677acd4d2ea7","label":"Root element 'feed' exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDf22143da-6d29-44de-8723-b11e85e7b441","label":"Guidance exists","parent":{"ref":"EID76ab47a4-4bb4-494d-8f01-66088b6ef856"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.isTrue(\n\t\"empty(//atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0])\",\n\t\"TR.missingGuidanceForDownloadingMultipleFiles\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID01859f31-5d26-452b-a2cc-6d99b91117a1","label":"TODO Feed Elements Mandatory","description":null,"parent":{"ref":"EID07c1c315-c45c-4dd5-8be3-6dd12604b337"},"testSteps":{"TestStep":[{"id":"EID6a056425-bb10-4c60-825f-918a41486935","label":"GetServiceFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EID72b3ddf5-299c-4614-98a5-6d6bff20f601","label":"Service Feed available","parent":{"ref":"EID6a056425-bb10-4c60-825f-918a41486935"},"expectedResult":"exist","expression":"200,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}},{"id":"EID1d725a88-4a09-4d3c-86f2-a5a530c5788e","label":"RunTestsForAllDatasetFeeds","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\n// Start parsing of Service Feed\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(props.getPropertyValue(\"feedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the URLs of the Dataset Feeds\ndef dataFeedUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[@rel='alternate' and @type='application/atom+xml']/@href\");\n\n// clear url to run the Dataset Feed tests, set the url to the serviceEndpoint to be sure.\nprops.setPropertyValue(\"dataFeedURL\",testRunner.testCase.testSuite.project.getPropertyValue(\"serviceEndpoint\"))\n\n// now run Feed test for each dataFeedUrl, to validate Dataset feeds\nfor( i in dataFeedUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to Dataset Feeds. Now checking Dataset Feed with URL: \" + i)\n   props.setPropertyValue(\"dataFeedURL\",i)\n   props.setPropertyValue(\"dataFeedURLEncoded\",i.replaceAll(\"&\",\"&amp;\"))\n   testRunner.runTestStepByName(\"ValidateDatasetFeed\")\n   // testRunner.runTestStepByName(\"Tracer\")\n   testRunner.runTestStepByName(\"PropertyTransferDatasetFeedXml\")\n   testRunner.runTestStepByName(\"RunTestsForAllDatasetUrls\")\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Run TestCase M-04: Dataset Metadata Mandatory\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c","label":"ValidateDatasetFeed","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDa0acb1e7-be24-468d-8647-fc0603312ea6","label":"M-04##AtomLinkSelf: Feed link to self exists and has proper language references","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $linkself:=/atom:feed/atom:link[@rel='self' and @type='application/atom+xml' and @hreflang=//atom:feed/atom:title/@xml:lang]/@href\nreturn\nif ($linkself='${#dataFeedURLEncoded}')\nthen \"\"\nelse \"The Atom feed does NOT contain a link to itself including a language reference. Check the element /atom:feed/atom:link with @rel='self'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID8523ae5b-baf3-42e3-9f97-4b75c2d41df2","label":"M-04##req20: Feed title exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $title:=/atom:feed/atom:title\nreturn\nif (string-length($title)=0)\nthen \"The Atom feed does NOT contain a Feed Title.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfed3a553-ca1f-4d25-9d19-bf83d617f84d","label":"M-04##req21: Feed id refers to self URL","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $atomid:=/atom:feed/atom:id\nreturn\nif ($atomid!='${#dataFeedURLEncoded}')\nthen concat(\"The Atom feed id \", $atomid,\" does NOT refer to the self URL (\",'${#dataFeedURLEncoded}',\").\")\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDe8aaf0c5-a1eb-4795-abdf-50eed952c424","label":"M-04##req22: Feed rights element exists","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $rights:=/atom:feed/atom:rights\nreturn\nif (string-length($rights)=0)\nthen \"The Atom feed does NOT contain rights information.\"\nelse \"\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID484655d1-a8b6-45ba-b895-a323cb52f05b","label":"M-04##req23: Feed updated element exists and contains a date and time","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $updated:=year-from-dateTime(xs:dateTime(/atom:feed/atom:updated))\nreturn\nif ($updated > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain updated information.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID6ed3a5ef-f791-4252-93b1-1237a811e900","label":"M-04##req24: Feed contains an author name and email address","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $author:=/atom:feed/atom:author[string-length(./atom:name)>0 and string-length(./atom:email)>0]\nreturn\nif (exists($author))\nthen \"\"\nelse \"The Atom feed does NOT contain an author name and/or email address.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDf506f6b8-3b2c-472f-aa14-cdb03782748f","label":"M-04##req25-28-31: Feed contains at least one entry for data, with a link to the dataset and length set or a section link in case of multiple files.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $nrdatalinks:=count(//atom:entry/atom:link[(@rel='alternate' and @type!='application/atom+xml' and number(@length) > 0) or (@rel='section')])\nreturn\nif ($nrdatalinks > 0)\nthen \"\"\nelse \"The Atom feed does NOT contain any entries with a correct link for data. Check if the entries contain alternate links (not referring to another Atom feed) or section links for multiple files.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3c9cdf67-38ba-4a51-85b0-a470a4ca411e","label":"M-04##req26a: Dataset feeds contain seperate entries for each format/CRS combination. Each entry link for download has one / the same (media)type","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='alternate' and @type!=../atom:link[1][@rel='alternate']/@type]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's link for download has different (media) types.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID3edea1b7-a51a-477a-a819-7a1b163feab6","label":"M-04##req26b: Dataset feeds contain seperate entries for each format/CRS combination. Each entry has the same CRS category elements","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:category[@term!=../atom:category[1]/@term]]\nreturn\nconcat (\"The entry with id: \",$entry/atom:id,\" does not contain separate entries for each media type/CRS combination. This entry's category terms are not the same, indicating that multiple CRSes are offered in the same entry.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID299103d0-5167-4cf4-b64c-a251f7b0f894","label":"M-04##req27: Feed contains at least one link to Spatial Object descriptions (in text/html)","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nlet $sodesc:=/atom:feed/atom:link[@rel='describedby' and @type='text/html']\nreturn\nif (exists($sodesc))\nthen \"\"\nelse \" there is no link to a Spatial Object description. That is: a link with type='text/html' and rel='describedby'.\"\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EIDfa8fff6a-c9e8-4b7e-8997-6d29163359a3","label":"M-04##req31: If a section link is provided (for multiple files) then there should be more than 1 section link","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:link[@rel='section'])=1]\nreturn\nconcat (\"If a section link is provided (for multiple files) then there should be more than 1 section link. The entry with id \", $entry/atom:id ,  \" has only 1 section link.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID36243a7d-204a-4d0b-b1ce-da634f14d302","label":"M-04##req32: If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[./atom:link[@rel='section'] and count(./atom:link[@rel='alternate'])=0 and count(./atom:content) = 0]\nreturn\nconcat (\"If multiple files are provided, then the links shall be of rel='section' and there shall be a content element or alternate link as a description. The entry with id \", $entry/atom:id ,  \" does not have this.\")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID4b9ecdf9-3b55-45f6-9343-d08cb5d04b56","label":"M-04##req34: Only media types listed in the INSPIRE media-types register at https://inspire.ec.europa.eu/media-types/ shall be used.","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\ndeclare namespace inspire_dls='http://inspire.ec.europa.eu/schemas/inspire_dls/1.0';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry\nwhere contains('${#mediaTypes}', $entry/atom:link[@rel='alternate']/@type)!=true\nreturn\nconcat(\"The alternate link \",$entry/atom:link[@rel='alternate']/@href,\" for entry with id \",$entry/atom:id,\" offers a media type '\",$entry/atom:link[@rel='alternate']/@type,\"' that is not in the INSPIRE list at https://inspire.ec.europa.eu/media-types/. \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}},{"id":"EID86273ea9-66e7-41d8-a171-3a8db6cbbcfc","label":"M-04##req35: Each entry shall have an element category for the CRS","parent":{"ref":"EIDd4c09a50-2618-4207-ae0d-0d5f772b840c"},"expectedResult":"<result>AssertionFailures:</result>","expression":"declare namespace atom='http://www.w3.org/2005/Atom';\ndeclare namespace georss='http://www.georss.org/georss';\ndeclare namespace xlink='http://www.w3.org/1999/xlink';\n\n<result>AssertionFailures:\n{\nfor $entry in //atom:entry[count(./atom:category[string-length(@term)>0 and string-length(@label)>0])!=1]\nreturn\nconcat (\"Each entry shall have one element category for the CRS. The entry with id \", $entry/atom:id ,  \" does not have 1 element, but :\" , count(./atom:category[string-length(@term)>0 and string-length(@label)>0]), \". \")\n}\n</result>","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/5c28b666-4dda-43af-aa6e-1eed6212d8d8.json"}}]}},{"id":"EID5ea3f9f5-ea00-4ce2-b94f-60274c759d85","label":"RunTestsForAllDatasetUrls","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"props = testRunner.testCase.testSteps['Properties']\n\ndef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);\ndef feedXmlHolder = groovyUtils.getXmlHolder(testRunner.testCase.testSuite.project.getPropertyValue(\"dataFeedXml\"))\nfeedXmlHolder.namespaces[\"atom\"] = \"http://www.w3.org/2005/Atom\";\nfeedXmlHolder.namespaces[\"xlink\"] = \"http://www.w3.org/1999/xlink\";\n\n// Pull out the dataSetUrlNodes\ndef dataSetUrlNodes = feedXmlHolder.getNodeValues(\"//atom:entry/atom:link[(@rel='alternate' or @rel='section') and @type!='application/atom+xml']/@href\");\n\n// Then run Feed test for each dataSetUrl\nfor( i in dataSetUrlNodes )\n{\n   i=i.replaceAll(\"%7B\",\"{\")\n   i=i.replaceAll(\"%7D\",\"}\")\n   log.info(\"The Atom feed refers to a dataset to download at the URL: \" + i)\n   props.setPropertyValue(\"dataSetURL\",i)\n   testRunner.runTestStepByName(\"ResolveDatasetLink\")\n   // testRunner.runTestStepByName(\"Tracer\")\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8","label":"ResolveDatasetLink","description":null,"parent":{"ref":"EID01859f31-5d26-452b-a2cc-6d99b91117a1"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":{"id":"EIDfced5ec0-ac9b-4792-bba9-0d1682a5c048","label":"Response starts within 30 seconds (using HTTP HEAD)","parent":{"ref":"EID59a32c2c-e930-4fa5-ac61-f2f94d55bdb8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}}}}]}}]}},{"id":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2","label":"OpenSearch Description","description":"Test module for checking the OpenSearch Description which is referenced by a Service Feed.\n<br/><br/>\n<b>Known limitations: </b> Response schema validation is not implemented yet.","testCases":{"TestCase":[{"id":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351","label":"Get OpenSearch Description link","description":"Technical Test Case to retrieve and set theURL to the OpenSearch Description. This Test Case depends on the Test Case 'Link to OpenSearch Description document' in the 'Download Service Feed' test module.","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684","label":"Get Service Feed","description":"Requests the Service Feed and set the URL to the OpenSearch description.","parent":{"ref":"EIDc7150cb1-fa7f-4589-9871-330bca1aa351"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb98e8d08-b750-4911-a3ed-a1b55ea4f400","label":"HTTP status code 200 is returned","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8c018d06-fce0-4029-9c58-62e544d85b07","label":"30 seconds timeout","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID3cee0dcc-2196-40ab-bd5f-a2ef0ed0d0d8","label":"Root element 'feed' exists","parent":{"ref":"EIDf150efa8-92d2-4fab-bfdf-e1ffbe8ff684"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID2627cf68-632b-45bc-b53e-74edae092d3a","label":"Provide languages","description":"The test case requests the OpenSearch Description document and checks if it provides at least one 'Language' element.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 45: For each language supported by the download service, the OpenSearch\ndescription shall contain a 'Language' element that contains the language\ncode. The first 'Language' element shall contain the Default Language.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-provides-languages\" target=\"_blank\">Abstract Test Case 'OpenSearch Description provides languages'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID1f602fae-4534-4d14-9b57-46dcb2702372","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID2627cf68-632b-45bc-b53e-74edae092d3a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID27a86dd2-6078-4fc4-bd6a-b0e62395b2e4","label":"HTTP status code 200 is returned","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDb5528c1c-abba-48af-84e7-c1a42b16ff4f","label":"30 seconds timeout","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDdbfd8d9a-6b29-4929-b5e7-f8899be624c7","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID0ca5302c-48aa-4097-912f-266ed6f51e05","label":"Description provides at least one Language","parent":{"ref":"EID1f602fae-4534-4d14-9b57-46dcb2702372"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Language\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionLanguage\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd","label":"Get Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if all \"Get Spatial Dataset\" operation responses have the same content-type as the media-type in the OpenSearch Description.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 43:The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Get Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'crs', 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value\ncorresponding to the media type of the result and an attribute 'rel' with the\nvalue 'results'. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-one-url-get-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description one URL Get Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDc839657a-0d7c-49d9-8665-ee32690350db","label":"HTTP status code 200 is returned","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2a9be6d6-6a7f-450c-b06b-04f9947d5ede","label":"30 seconds timeout","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID89094358-9df9-46f9-b3ee-11735bd3eaf8","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID56bcbfd7-4d1e-40c9-a718-12f1b5f7e77f","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID74afa0d4-5f0e-4a47-b08f-7ca403dd85e3","label":"At least one Language provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID793e1bf6-1c47-4819-b552-1be93e488ee8","label":"At least one CRS provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDae479e65-ab3b-4e21-92ec-4acfdfcc8424","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EIDc6f32dae-43d2-4dd7-9c6e-6d252e83886d"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EIDb0803022-623e-456c-aa2e-bc968ee33150","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EIDea92f351-8560-4190-b129-202d1de67410","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID90ac1268-2c6a-46d4-94da-cb1a595847b2","label":"HTTP status code 200 is returned","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID4c8b189c-31ec-4098-8f45-6952a58780c6","label":"30 seconds timeout","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID75f52c4d-7efd-412d-b177-9c7b581e95d3","label":"Response content-type equals media-type from Get Spatial Dataset URL","parent":{"ref":"EIDea92f351-8560-4190-b129-202d1de67410"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\nString mimeType = context.expand('${Transfer_Properties#mimeType}');\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(mimeType)) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", mimeType, \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478","label":"Describe Spatial Dataset operation","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for the Describe Spatial Data Set operation.\n<br />\n<br />\nRelevant Requirements:\n<ul>\n<li>TG Requirement 42: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for the Describe Spatial Data Set operation. This template shall\naccept the INSPIRE parameters 'spatial_dataset_identifier_code',\n'spatial_dataset_identifier_namespace' and the OpenSearch 'language'\nparameter. The 'Url' element shall have an attribute 'type' with a value of\n'application/atom+xml' and an attribute 'rel' with the value 'describedby'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-describe-spatial-dataset-operation\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL Describe Spatial Dataset operation'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96","label":"Get OpenSearch Description","description":"Requests the OpenSearch Description.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd1e8ab33-11a0-45da-b116-4a4c8ffa139c","label":"HTTP status code 200 is returned","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDab501b29-1391-4093-87bf-5a67b23a451b","label":"30 seconds timeout","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDf244d763-7392-49c7-aedc-74703bd8dcca","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID7263d98c-e24b-4f93-96f1-cb420ef57a95","label":"Description provides at least one \"Url\" element that describes a template URL for the Describe Spatial Data Set operation","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='describedby' and @type='application/atom+xml' and starts-with(@template,'http') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDa3d96fc4-8656-44a2-a219-261052291d3f","label":"At least one Language provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @language] or /os:OpenSearchDescription/os:Language\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDd6ecb614-9004-4d11-8e4c-26f2ce1a614f","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID95ff121f-4671-4cdd-b851-ddb3119b7c96"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\",\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9ac761b8-d714-444f-9b15-d3ac4a3dda9b","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='describedby' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Describe Spatial Dataset response equals 'application/atom+xml'.","parent":{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDd77ce483-2a5c-42af-b442-0043e535de70","label":"HTTP status code 200 is returned","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDa1a33924-7e37-4ae9-9d59-24c5bf976d8e","label":"30 seconds timeout","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDfbb9511f-dd9a-4be4-b8ba-d35eb2039432","label":"Response content-type is 'application/atom+xml'","parent":{"ref":"EID1693ebfb-e21b-457b-9fe3-ebee745d2204"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].contains(\"application/atom+xml\")) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"application/atom+xml\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287","label":"Query examples for each dataset","description":"The test case requests the OpenSearch Description document and checks if it provides a Describe Spatial Dataset and Get Spatial Dataset url.\nFor each category CRS from the Describe Spatial Dataset response a Get Spatial Dataset request with the CRS, the provided inspire_dls:spatial_dataset_identifier_code and inspire_dls:spatial_dataset_identifier_namespace is invoked.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 44: For each dataset available the OpenSearch description shall contain a 'Query'\nelement that has a 'role' attribute with the value 'example' and\n'spatial_dataset_identifier_code' and 'spatial_dataset_identifier_namespace'\nattributes together containing unique spatial dataset identifier. The value of the\n'crs' and 'language' attributes shall be set to the values considered as the\ndefault ones by the service provider. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-query-examples-for-each-dataset\" target=\"_blank\">Abstract Test Case 'OpenSearch Description Query examples for each dataset'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":[{"ref":"EID458af16e-a708-4b83-96f2-f13ec03c6bfd"},{"ref":"EID4ab8b4e8-abd9-4c93-9fb4-ca1921cca478"},{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}]},"testSteps":{"TestStep":[{"id":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDcc65b492-6f51-40bd-a1f6-2b4fb6e8919e","label":"HTTP status code 200 is returned","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDcd7b5983-205a-4a5f-8ed9-acfb3adf3baa","label":"30 seconds timeout","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2ab6ede6-3e2a-4f3c-9dfe-8c61dc161e10","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfac69c38-3e71-4586-a376-9504f2c3eb53","label":"Description provides at least one \"Url\" element that describes a template URL for the Get Spatial Data Set operation","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and starts-with(@template,'http') and contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\",\n  \"TR.missingAtLeastOneOpenSearchDescriptionUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDc6baa4d2-7ab0-4861-af59-76cb9955bd99","label":"At least spatial_dataset_identifier_namespace and spatial_dataset_identifier_code provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:spatial_dataset_identifier_namespace and @inspire_dls:spatial_dataset_identifier_code]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDfd3132fa-1ea8-420b-832a-12afda7a537d","label":"At least one CRS provided","parent":{"ref":"EID0794eacb-a4a7-4a43-acc6-1f0dcb958bc8"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Query[@role='example' and @inspire_dls:crs]\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID9858617d-7532-45ec-b33e-dc2ca953dec2","label":"Iterate over Describe Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Get OpenSearch Description\")\n\ndef describeSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"describeSpatialDataSetUrls: \" + describeSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\n// clear url to test\nph.setTransferProperty(\"describeSpatialDataSetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in describeSpatialDataSetUrlTemplates ) {\n\tString describeSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+describeSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(describeSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(describeSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"describeSpatialDataSetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Describe Spatial Dataset\");\n\t\t\t\t\tph.runTestStep(\"Iterate over Get Spatial Dataset URL\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2","label":"Describe Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EIDb4f5a27b-e2d2-40d0-bcfc-c58962e49e58","label":"HTTP status code 200 is returned","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDbc1f86a5-e03a-43de-bb43-124085e61f12","label":"30 seconds timeout","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe3ad2fd7-379c-4d9f-807f-db7975c3b0e6","label":"Root element 'feed' exists","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDdc98fad0-7697-479a-ac12-e9d4fd36242f","label":"Each entry has an element category, including a term and label, to refer to CRSs","parent":{"ref":"EID8dadd33c-6020-4533-827c-f01dbcebf4f2"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.notExists(\n  \"//atom:entry[count(atom:category[string-length(@term)>0 and string-length(@label)>0])<1]\",\n  \"TR.missingCategory\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID4a9036db-eb9c-458c-b8ad-58b3ff5b82a7","label":"Iterate over Get Spatial Dataset URL","description":null,"parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"import de.interactive_instruments.xtf.*;\nSOAPUI_I.init(log,context,testRunner);\nimport de.interactive_instruments.UriUtils;\n\nProjectHelper ph = new ProjectHelper();\ndef xmlHolder = ph.getTestStepResult(\"Describe Spatial Dataset\")\n\ndef getSpatialDataSetUrlTemplates = xmlHolder.getDomNodes(\n\t\"/*:OpenSearchDescription/*:Url[@rel='results' and starts-with(@template,'http') and \"+\n\t\"contains(@template,'crs') and contains(@template,'spatial_dataset_identifier_code') and \"+\n\t\"contains(@template,'spatial_dataset_identifier_namespace') and contains(@template,'language')]\");\nlog.info(\"getSpatialDatasetUrls: \" + getSpatialDataSetUrlTemplates);\n\n\ndef languages = xmlHolder.getNodeValues(\n\t\"distinct-values((/*:OpenSearchDescription/*:Query[@role='example']/@language , /*:OpenSearchDescription/*:Language))\");\nlog.info(\"languages: \" + languages);\n\ndef namespaces = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_namespace\");\nlog.info(\"namespaces: \" + namespaces);\n\ndef codes = xmlHolder.getNodeValues(\n\t\"/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:spatial_dataset_identifier_code\");\nlog.info(\"codes: \" + codes);\n\ndef crss = xmlHolder.getNodeValues(\n\t\"distinct-values(/*:OpenSearchDescription/*:Query[@role='example']/@inspire_dls:crs)\");\nlog.info(\"CRSs: \" + crss);\n\n// clear url to test\nph.setTransferProperty(\"getSpatialDatasetUrl\", \"\")\n\nvoid replaceParameter(parameters, cleanParameters, templateKey, templateValue) {\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(value.contains(\"{\"+templateKey+\"}\") || value.contains(\"{\"+templateKey+\"?}\")) {\n\t\t\tcleanParameters.put(e.key, templateValue);\n\t\t}\n\t}\n}\n\ndef initDefaultParameters(parameters) {\n\tfinal Map<String, String> params = new HashMap<String, List<String>>();\n\tfor ( e in parameters ) {\n\t\tdef value = e.value[0]\n\t\tif(!(value.contains(\"{\") && value.contains(\"}\"))) {\n\t\t\tparams.put(e.key, value);\n\t\t}\n\t}\n\treturn params\n}\n\ndef invokedUrls = [] as HashSet\n\nfor( node in getSpatialDataSetUrlTemplates ) {\n\tString getSpatialDataSetUrlTemplate = node.attributes.getNamedItem(\"template\").getNodeValue()\n\tString mimeType = node.attributes.getNamedItem(\"type\").getNodeValue()\n\n\tlog.info(\"Using template URL: \"+getSpatialDataSetUrlTemplate);\n\tdef parameters = UriUtils.getQueryParameters(getSpatialDataSetUrlTemplate, false)\n\tfinal Map<String, String> cleanParameters = initDefaultParameters(parameters)\n\tfinal String endpoint = UriUtils.withoutQueryParameters(getSpatialDataSetUrlTemplate)\n\n\tfor(int j=0; j<codes.size(); j++) {\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_code\", codes[j] )\n\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:spatial_dataset_identifier_namespace\", namespaces[j] )\n\n\t\tfor(crs in crss) {\n\t\t\treplaceParameter(parameters, cleanParameters, \"inspire_dls:crs\", crs )\n\n\t\t\tfor(language in languages) {\n\t\t\t\treplaceParameter(parameters, cleanParameters, \"language\", language )\n\t\t\t\tfinal String url = UriUtils.withQueryParameters(endpoint, cleanParameters)\n\t\t\t\tif(!invokedUrls.contains(url)) {\n\t\t\t\t\tlog.info(\"Using URL: \"+url)\n\t\t\t\t\tph.setTransferProperty(\"getSpatialDatasetUrl\", url)\n\t\t\t\t\tph.setTransferProperty(\"mimeType\", mimeType)\n\t\t\t\t\tph.runTestStep(\"Get Spatial Dataset\");\n\t\t\t\t\tinvokedUrls.add(url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/90bdc939-bd42-41a0-9ef8-19e0ec04f89d.json"}},{"id":"EID3e55838a-6ac8-422c-84f3-a958d9956095","label":"Get Spatial Dataset","description":"Checks if the content-type of the Get Spatial Dataset response equals the media-type from the Open Search Description document","parent":{"ref":"EID34cb9ce5-899c-4f79-bfea-80166b6f6287"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID48c19232-171e-4726-80d5-e8e18c7ac347","label":"HTTP status code 200,206,301,302 or 303 is returned","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"exist","expression":"200,206,301,302,303","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID8bb0253c-0901-4714-babe-8175b5e71aa5","label":"30 seconds timeout","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID71d855f0-318b-4449-87cf-5841eb9f68e2","label":"Root element 'feed' exists","parent":{"ref":"EID3e55838a-6ac8-422c-84f3-a958d9956095"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/atom:feed\", \"TR.missingFeedRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}},{"id":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a","label":"URI to itself","description":"The test case requests the OpenSearch Description document and checks if it provides a self URL.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 40: The OpenSearch description shall contain a 'Url' element that describes an\nHTTP URI for the OpenSearch Description document. The value of the 'rel'\nattribute of this element shall be 'self', the value of the 'type' attribute shall be\n'application/opensearchdescription+xml' and the value of the 'template'\nattribute shall be the HTTP URI of the document. </li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-uri-to-itself\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URI to itself'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":{"id":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID6b2a0d87-fca5-4e6d-ac49-3c338d08e10a"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID07baa915-7c6b-4fad-b1bf-ef03d306dc85","label":"HTTP status code 200 is returned","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDde93e839-9029-4c1b-a47b-950437792241","label":"30 seconds timeout","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID2efd175c-e24e-4924-9bdd-13237591a99f","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EIDb0365336-42e6-48a6-84f1-e0ea2ef34168","label":"Self reference equals URL of requested resource","parent":{"ref":"EID604e5275-94c1-4ee9-81a0-6dd5a9309d06"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nimport de.interactive_instruments.xtf.*\nSOAPUI_I.init(log, context, messageExchange)\nfinal ProjectHelper ph = new ProjectHelper()\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.equals(\n  \"/os:OpenSearchDescription/os:Url[@rel='self' and @type='application/opensearchdescription+xml']/@template\",\n  \"/os:OpenSearchDescription/os:Url\",\n  messageExchange.getEndpoint(),\n  \"TR.incorrectFeedSelfReference\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}}},{"id":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8","label":"Generic search queries URL","description":"The test case requests the OpenSearch Description document and checks if it provides an \"Url\" element that describes a template URL for generic search queries.\nThe resource at the URL is retrieved and checked if it returns HTML content.\n<br/>\n<br/>\nRelevant Requirements:\n<ul>\n<li>TG Requirement 41: The OpenSearch description shall contain a 'Url' element that describes a\ntemplate URL for generic search queries. The value of the 'rel' attribute of this\nelement shall be 'results', the value of the 'type' attribute shall be 'text/html'.</li>\n</ul>\n<br/>\n<br/>\nSource: <a href=\"http://inspire.ec.europa.eu/id/ats/download-service/master/atom-pre-defined/opensearch-description-url-generic-search-queries\" target=\"_blank\">Abstract Test Case 'OpenSearch Description URL generic search queries'</a>","parent":{"ref":"EIDc4154735-aa8a-40cb-9bbf-fba0ef78c7e2"},"dependencies":{"testCase":{"ref":"EID6359d6da-1e37-423f-b543-018979b665e2"}},"testSteps":{"TestStep":[{"id":"EIDd7849eeb-9029-4354-96fa-e3029f94c431","label":"Get OpenSearch Description","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID8cb55602-5705-4d92-8d35-08732f19ae81","label":"HTTP status code 200 is returned","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID16c6d755-39bc-4f78-8ece-4799d2d67acc","label":"30 seconds timeout","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID5431e387-2cf1-46c2-bc0f-5f62496cda67","label":"Root element 'OpenSearchDescription' exists","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nAssert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\na.exists(\"/os:OpenSearchDescription\", \"TR.missingOpenSearchDescriptionRootElement\");","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}},{"id":"EID6135b42e-8137-40d5-902b-5ff839d143e2","label":"Description provides a template URL for generic search queries","parent":{"ref":"EIDd7849eeb-9029-4354-96fa-e3029f94c431"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.*\nfinal Assert a = new Assert(messageExchange, context, log, Assert.INSPIRE_DS_NS);\n\na.exists(\n  \"/os:OpenSearchDescription/os:Url[@rel='results' and @type='text/html']/@template\",\n  \"TR.missingGenericSearchQueriesUrl\"\n);","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}},{"id":"EID57097ab3-b698-4767-886b-45496e3bd4b6","label":"Get resource at generic search quries URL","description":"Requests the Service Feed and checks if the dataset feed links are correct.","parent":{"ref":"EID7369a02b-be8b-40fb-ae98-d16f93be2fa8"},"statementForExecution":"NOT_APPLICABLE","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/6b16aa44-bdc7-4120-a790-4b74fc9ace62.json"},"testAssertions":{"TestAssertion":[{"id":"EID69821145-bef3-41af-adfe-226eaf86cd9a","label":"HTTP status code 200 is returned","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"exist","expression":200,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EID9dca43cb-4a8a-4789-ae48-450166a6ce0b","label":"30 seconds timeout","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":30000,"testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/e7e29c93-4c50-41c2-82d1-0f2db6a1abf6.json"}},{"id":"EIDe182dea2-63b0-4dff-94fb-c815e45da6f6","label":"Content-Type is HTML","parent":{"ref":"EID57097ab3-b698-4767-886b-45496e3bd4b6"},"expectedResult":"NOT_APPLICABLE","expression":"import de.interactive_instruments.etf.suim.TranslatableAssertionError;\n\nif(messageExchange.responseHeaders[\"Content-Type\"]==null) {\n\tthrow new TranslatableAssertionError(\"TR.missingContentType\");\n}\n\nif(!messageExchange.responseHeaders['Content-Type'][0].startsWith('text/html')) {\n\tthrow new TranslatableAssertionError(\"TR.unexpectedContentType\", \"expected\", \"text/html\", \"actual\", messageExchange.responseHeaders['Content-Type'][0]);\n}","testItemType":{"href":"https://inspire.ec.europa.eu/validator//v2/TestItemTypes/fad9282c-1f1f-492b-b6ab-248430154310.json"}}]}}]}}]}}]}}},"testObjects":{"TestObject":{"id":"EID58c1dd65-07a3-493b-acc2-9bed6fa469f0","remoteResource":"https://geodata.nationaalgeoregister.nl/atom/index.xml","label":"index.xml","description":"Web Test Object","version":"1.0.0","author":"unknown","creationDate":"2020-11-02T12:39:14.744Z","lastEditor":"unknown","lastUpdateDate":"2020-11-02T12:39:15.612Z","disabled":false,"testObjectTypes":{"testObjectType":{"ref":"EID49d881ae-b115-4b91-aabe-31d5791bce52"}},"ResourceCollection":{"resource":{"name":"serviceEndpoint","href":"https://geodata.nationaalgeoregister.nl/atom/index.xml"}},"Properties":{"property":[{"name":"temporary","$":true},{"name":"data.downloadable","$":false}]}}},"testObjectTypes":{"TestObjectType":{"id":"EID49d881ae-b115-4b91-aabe-31d5791bce52","label":"Atom feed","description":"A feed implementing the Atom Syndication Format that can be accessed using HTTP(S).","parent":{"href":"https://inspire.ec.europa.eu/validator//v2/TestObjectTypes/88311f83-818c-46ed-8a9a-cec4f3707365.json"}}},"translationTemplateBundles":{"TranslationTemplateBundle":{"id":"EIDfadd4929-fa60-4781-b658-703bbfe3f4eb","source":"file:/etf/projects/inspire-ets-repository/ets-repository-2020.3/include-metadata/TranslationTemplateBundle-EIDfadd4929-fa60-4781-b658-703bbfe3f4eb.xml","translationTemplateCollections":{"LangTranslationTemplateCollection":[{"name":"TR.operationsMetadataConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.operationsMetadataConformanceClassNotSupported","$":"The ows:OperationsMetadata do not advertize the required conformance class {element}"}}},{"name":"TR.feedIdDoesNotReferToEndpoint","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.feedIdDoesNotReferToEndpoint","$":"The Atom feed id '{actual}' element does NOT refer to the self URL '{expected}'."}}},{"name":"TR.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.xmlExpected","$":"Expected a XML response but the service returned unparsable data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.capabilities.extended.inspire.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.invalidValue","$":"INSPIRE {name} must be set to '{value}'. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingContentType","$":"Expected a 'Content-Type' header field to be returned by the server."}}},{"name":"TR.metadata.operatesOn.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingElement","$":"The metadata of the WFS does not contain any coupled resource (srv:operatesOn)"}}},{"name":"TR.missingInfoFeatureAccessService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInfoFeatureAccessService","$":"The INSPIRE keyword infoFeatureAccessService is not advertized in the Capabilities. Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingMdFileIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdFileIdentifier","$":"The fileIdentifier does not exist in the service metadata. Check the Metadata document.'"}}},{"name":"TR.notAnInspireMediaType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnInspireMediaType","$":"The alternate links '{links}' for entries with IDs {ids} offer media types '{types}' that are not in the INSPIRE media type list at http://inspire.ec.europa.eu/media-types/ ."}}},{"name":"TR.preCondition.testStep.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.unexpectedException","$":"The required response of the test step '{testStepName}' can not be used for this test, due to an exception report has been returned."}}},{"name":"TR.capabilities.noFeatureTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noFeatureTypes","$":"No FeatureType found in the Capabilities. Check the Capabilities and configure the service to list at least one FeatureType."}}},{"name":"TR.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noOutputFormats","$":"No Output Formats were found in the Capabilities."}}},{"name":"TR.schemaNotAccessible","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAccessible","$":"The xsi:schemaLocation ' {url} ' can not be accessed, server returned HTTP response code {code}."}}},{"name":"TR.missingWfsMetadataUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingWfsMetadataUrl","$":"List of FeatureTypes, that do not possess the required MetadataURL element: {name}."}}},{"name":"TR.invalidApplicationSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema","$":"An error occurred while analyzing the application schema: ' {message} '."}}},{"name":"TR.notIsoMetadata","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notIsoMetadata","$":"The referred dataset Metadata document does not seem to be ISO Metadata. It does not have an XML element gmd:Metadata. Check the MetadataURL listed in the Capabilities and the Metadata document."}}},{"name":"TR.idNotAnURI","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.idNotAnURI","$":"The Feed ID (/atom:feed/atom:id) is not a HTTP URI."}}},{"name":"TR.manual.checkLengthOfDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLengthOfDlFile","$":"Not all linked pre-defined dataset files provide a 'length' attribute. Check if it can be provided."}}},{"name":"TR.missingLinkToRegistry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToRegistry","$":"Missing at least one link to a registry (a /atom:feed/atom:link element with attributes rel='describedby' and type='text/html')."}}},{"name":"TR.metadata.operatesOn.missingHref","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.metadata.operatesOn.missingHref","$":"There is at least one element srv:operatesOn in the metadata of the WFS that does not refer to a metadata document as the xlink:href attribute does not exist or is empty. Check the Metadata document.\""}}},{"name":"TR.missingSchemaRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaRootElement","$":"There response does not have a XML 'schema' root element."}}},{"name":"TR.manual.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.missingInspireStoredQuery","$":"Check manually that the provided StoredQuery is sufficiently described with the included parameters."}}},{"name":"TR.manual.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet' should be used for serving pre-defined Spatial Data Sets."}}},{"name":"TR.elementsNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementsNotExpected","$":"'{elements}' were not expected in the response. XPath: {xpath}"}}},{"name":"TR.missingCapabilitiesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCapabilitiesRootElement","$":"The response does not have a 'WFS_Capabilities' root element."}}},{"name":"TR.filterConformanceClassNotSupported","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.filterConformanceClassNotSupported","$":"The fes:Filter_Capabilities do not advertize the required Filter Encoding 2.0 conformance class {element}"}}},{"name":"TR.incorrectFeedSelfReference","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReference","$":"The Atom feed does NOT contain a link to itself that equals the URL of the requested resource. Check the element /atom:feed/atom:link with @rel='self' and the the request URL."}}},{"name":"TR.missingLinkageResourceLocator","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkageResourceLocator","$":"The referred Metadata Record does have a Resource Locator (gml:linkage element). Check the response."}}},{"name":"TR.missingFeatureCollectionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeatureCollectionRootElement","$":"The response does not have a WFS 'FeatureCollection' root element."}}},{"name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ft.missingOwsWgs84BoundingBox","$":"List of FeatureTypes, that do not possess the required WGS84BoundingBox element: {name}."}}},{"name":"TR.missingSpatialDataSetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDataSetIdentifierNamespace","$":"The absent inspire_dls:SpatialDataSetIdentifier/inspire_common:Namespace element is declared optional in the schema, however it is a mandatory element in the ExtendedCapabilities."}}},{"name":"TR.internalError","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.internalError","$":"Internal error in the Executable Test Suite. Please contact a system administrator. Error information: {text}"}}},{"name":"TR.unexpectedContentType","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedContentType","$":"Expected '{expected}' as Content-Type header but server returned '{actual}'"}}},{"name":"TR.recommendation.GetSpatialDataSetIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.recommendation.GetSpatialDataSetIdentifier","$":"The recommended identifier 'http://inspire.ec.europa.eu/operation/download/GetSpatialDataSet', which should be used for serving pre-defined Spatial Data Sets, was not found."}}},{"name":"TR.missingSpatialDatasetIdentifierNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierNamespace","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_namespace element."}}},{"name":"TR.unexpectedException","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedException","$":"The service returned an unexpected exception: '{text}'. Check the request parameters, which are partially determined from the Capabilities, previous requests or other metadata. Ensure that the service supports the data and functionalities published in the Capabilities and ensure that referenced data exist."}}},{"name":"TR.incorrectFeedSelfReferenceLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLanguage","$":"The Atom feed does NOT contain a link to itself with a 'hreflang' attribute that either equals the xml:lang attribute ('/atom:feed/atom:title/@xml:lang') or the OpenSearchDescription language code ('/os:OpenSearchDescription/os:Language[1]')."}}},{"name":"TR.preCondition.testStep.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.missingElement","$":"The test compares data from this response with data from another test step, however the node '{element}' could not be found or has an empty value in test step '{testStepName}'."}}},{"name":"TR.missingOneFeedEntryWithDlFile","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOneFeedEntryWithDlFile","$":"Missing at least one feed entry with at least one link to a pre-defined dataset file."}}},{"name":"TR.initializationAndBasicChecksFailed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.initializationAndBasicChecksFailed","$":"The testing of basic functionalities of the service failed and therefore all other test cases are skipped. Check all failed Test Cases in the 'Initialization and basic checks' module and ensure that the endpoints for GetCapabilities, GetFeature and DescribeFeatureType operations are accessible from outside your organization."}}},{"name":"TR.elementWithValueNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementWithValueNotExpected","$":"A node '{elementName}' with the value '{value}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.responseNotEqual","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.responseNotEqual","$":"The Response from this Test Step '{testStep}' and the Response from the Test Step are not equal."}}},{"name":"TR.invalidXmlProlog","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidXmlProlog","$":"Expected a XML response but the service returned unparsable data with illegal characters before the XML prolog. This is an excerpt of the XML prolog, showing the first 6 characters (invalid characters may have either been hidden by the browser or are replaced with '?'): '{prolog}'. Please note that some tools, such as some browsers, do not show all special characters or report an error!"}}},{"name":"TR.preCondition.testStep.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.noDataReturned","$":"The required response of the test step '{testStepName}' can not be used for this test, due to no data has been returned."}}},{"name":"TR.unexpectedCRS","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedCRS","$":"Expected a response in Coordinate Reference System '{expected}' but a response in CRS '{value}' was returned by the service."}}},{"name":"TR.uniqueAlternateLinkTypes","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueAlternateLinkTypes","$":"The Dataset Feed does not contain separate entries for each format and CRS combination. Check if either the links belong in one single Dataset feed entry or in another/new separate Dataset Feed. {count} duplicate entries found: {duplicates}"}}},{"name":"TR.missingElementWithValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElementWithValue","$":"Expected a node '{element}' set to '{value}' but it was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSpatialDatasetIdentifierCode","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSpatialDatasetIdentifierCode","$":"There is at least one Feed entry without an inspire_dls:spatial_dataset_identifier_code element."}}},{"name":"TR.emptyValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.emptyValue","$":"Expected a non-empty text value for '{element}'. XPath: {xpath}"}}},{"name":"TR.capabilities.noOutputFormats","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.noOutputFormats","$":"No OutputFormat found in the Capabilities. Check the Capabilities and configure the service to list at least one OutputFormat."}}},{"name":"TR.missingInspireStoredQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingInspireStoredQuery","$":"DescribeStoredQueries response does not contain at least one StoredQuery with the parameters 'CRS', 'DataSetID' , 'DataSetIdNamespace', 'Language', to download the entire INSPIRE dataset."}}},{"name":"TR.missingGenericSearchQueriesUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGenericSearchQueriesUrl","$":"The Open Search Description does not provide a URL for generic search queries."}}},{"name":"TR.capabilities.extended.inspire.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.extended.inspire.missingElement","$":"INSPIRE element '{element}' is  missing in the Capabilities. XPath: {xpath} . Check the INSPIRE ExtendedCapabilities."}}},{"name":"TR.missingFeedRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedRootElement","$":"There response does not have an Atom 'feed' root element."}}},{"name":"TR.missingLinkToMetadataRecordForDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToMetadataRecordForDownloadService","$":"Missing a link to the metadata record for the download service link with attributes rel='describedby' and type='application/xml' or type='application/vnd.ogc.csw.GetRecordByIdResponse_xml'."}}},{"name":"TR.invalidDatasetFeedLinks","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidDatasetFeedLinks","$":"There is at least one feed entry that does not contain exactly one Dataset feed link with attributes rel='alternate' and type='application/atom+xml'."}}},{"name":"TR.exactlyOneCategoryPerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneCategoryPerEntry","$":"A Dataset Feed shall possess exactly one category per entry. There are {actual} Dataset Feed entries, which possess more than one category. Remove all additional categories."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionLanguage","$":"The response does not have at least one Open Search Description Language."}}},{"name":"TR.multipleLinksForMultipleFilesExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.multipleLinksForMultipleFilesExpected","$":"If links with a rel attribute of \"section\" are provided, then there must be multiple links. So the number of section links must not be exactly 1."}}},{"name":"TR.invalidLegendFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidLegendFormat","$":"Legend format is invalid. Please, review your code and try again."}}},{"name":"TR.unexpectedHtml","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.unexpectedHtml","$":"Expected a XML response but the service returned a HTML page. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication and returned an authentication page, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missinAtLeasOneOpenSearchDescriptionQuery","$":"Missing at least one INSPIRE example Query ( with a role='example', an inspire_dls:spatial_dataset_identifier_code and an inspire_dls:spatial_dataset_identifier_namespace attribute)."}}},{"name":"TR.schemaNotAnUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.schemaNotAnUrl","$":"The xsi:schemaLocation ' {url} ' is not an HTTP URL."}}},{"name":"TR.invalidApplicationSchema.outputFormat","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidApplicationSchema.outputFormat","$":"An error occurred while analyzing the application schema (OutputFormat ' {format} ') : ' {message} '."}}},{"name":"TR.invalidValue","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.invalidValue","$":"Expected the value '{expected}' instead of '{actual}' in {element}. XPath: {xpath}"}}},{"name":"TR.capabilities.ows.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.ows.missingElement","$":"{element} is not set in the Capabilities. Check the Capabilities for the OWS element."}}},{"name":"TR.exactlyOneAlternateLinkTypePerEntry","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.exactlyOneAlternateLinkTypePerEntry","$":"In a Dataset Feed an entry can possess multiple alternate links but these shall be of the same type. There are {actual} Dataset Feed entries, which alternate links with multiple types. Check if the alternate links belong to another/new Dataset Feed entry."}}},{"name":"TR.missingCategory","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingCategory","$":"At least one category for an entry is missing which refers to CRS definition and code."}}},{"name":"TR.dateIsInTheFuture","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsInTheFuture","$":"The date must not be in the future."}}},{"name":"TR.elementNotExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.elementNotExpected","$":"'{element}' was NOT expected in the response. XPath: {xpath}"}}},{"name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.openSearchDescriptionDocumentLinkNotAbsolute","$":"The OpenSearch Description document link is not an absolute URL."}}},{"name":"TR.missingOpenSearchDescriptionRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionRootElement","$":"The response does not have an Open Search 'OpenSearchDescription' root element."}}},{"name":"TR.preCondition.testStep.xmlExpected","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.preCondition.testStep.xmlExpected","$":"The required response of the test step '{testStepName}' can not be used for this test, due to not well-formed XML has been returned."}}},{"name":"TR.capabilities.featureTypeUnknownNamespace","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.capabilities.featureTypeUnknownNamespace","$":"The namespace prefix of FeatureType {value} can not be resolved. Check the namespaces and prefixes in the Capabilities."}}},{"name":"TR.missingOpenSearchDescriptionDocumentLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingOpenSearchDescriptionDocumentLink","$":"The Atom feed does NOT contain a link to an OpenSearch Description document."}}},{"name":"TR.incorrectFeedSelfReferenceLang","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.incorrectFeedSelfReferenceLang","$":"The self link's hreflang attribute is not the same as the xml:lang attribute of the Atom feed or if the xml:lang attribute is not given, hreflang is not the same as the language code defined in the OpenSearch description."}}},{"name":"TR.missingLanguageForDownloadLink","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLanguageForDownloadLink","$":"Not all alternative language representations of datasets have the required hreflang attribute."}}},{"name":"TR.dateIsBefore2012","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.dateIsBefore2012","$":"The date must not be before 2012."}}},{"name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingAtLeastOneOpenSearchDescriptionUrl","$":"The response does not have at least one Open Search Description URL."}}},{"name":"TR.fallbackInfo","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.fallbackInfo","$":"The server experienced a several unexpected error. Please, try again later. if the problem persist, please contact with the helpdesk."}}},{"name":"TR.missingFeedUpdatedInformation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingFeedUpdatedInformation","$":"The Atom feed does NOT contain updated information."}}},{"name":"TR.missingStoredQueriesRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingStoredQueriesRootElement","$":"The response does not have a 'DescribeStoredQueriesResponse' root element."}}},{"name":"TR.atLeastOneCategoryNotInServiceFeed","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.atLeastOneCategoryNotInServiceFeed","$":"At least one Category in the Dataset feed is not listed in the Download Service Feed."}}},{"name":"TR.uniqueDatasetIdentifiers","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.uniqueDatasetIdentifiers","$":"The Dataset Feed does not contain unique identifier combinations (inspire_dls:spatial_dataset_identifier_namespace and inspire_dls:code)."}}},{"name":"TR.manual.checkLinkToDirectAccessDownloadService","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.manual.checkLinkToDirectAccessDownloadService","$":"If the same dataset is available as a WFS 2.0.0 Direct Access Download Service: check that the download service feed includes a link to the WFS Capabilities document with the \"rel\" attribute set to \"related\" and the \"type\" attribute set to \"application/xml\"."}}},{"name":"TR.noDataReturned","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.noDataReturned","$":"Expected a response but the service did not return any data. Verify that the used endpoint URL is correct and accessible from outside your organization. If the service requires authentication, then check that the correct credentials are used by the validator or verify that upstream firewalls/proxy servers do not prevent access."}}},{"name":"TR.notAnHttpUrl","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.notAnHttpUrl","$":"' {url} ' is not an HTTP URL."}}},{"name":"TR.missingElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingElement","$":"The expected node '{element}' was not found in the response. XPath: {xpath}"}}},{"name":"TR.missingSchemaLocation","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingSchemaLocation","$":"The schema attribute 'xsi:schemaLocation' was not found in the XML root element of the response. The response cannot be validated."}}},{"name":"TR.missingGuidanceForDownloadingMultipleFiles","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingGuidanceForDownloadingMultipleFiles","$":"Where a dataset is provided in multiple physical files: a description of the dataset structure must be provided EITHER in an atom \"content\" element as free text, OR in an external document which is the target of another \"link\" element. Where a \"link\" element is used this element shall have a \"rel\" value equal to \"alternate\" and a suitable media type shall be used for the \"type\" value."}}},{"name":"TR.missingLinkToDatasetMetadataRecord","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingLinkToDatasetMetadataRecord","$":"Missing at least one link in an entry to a Dataset metadata record link with attributes rel='describedby' and type='application/xml'."}}},{"name":"TR.missingDownloadServiceSchema","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingDownloadServiceSchema","$":"The Capabilities do not contain a xsi:schemaLocation with the INSPIRE Download Services schema 'http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd' or at least a schema path ending with 'inspire_dls.xsd. Check the Capabilities document."}}},{"name":"TR.missingMdIdentifier","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMdIdentifier","$":"The MD_identifier '{id}' is found in the metadata document but does not exist in the service Metadata. The service metadata refers to these identifiers: '{datasetIdentifiersList}'. Check the Service Metadata and the Metadata document."}}},{"name":"TR.missingMDMetadataRootElement","translationTemplates":{"TranslationTemplate":{"language":"en","name":"TR.missingMDMetadataRootElement","$":"The referred Metadata Record does not seem to be ISO Metadata. It does not have an XML gmd:MD_Metadata root element. Check the response."}}}]}}},"testTaskResults":null}}}
* print response.EtfItemCollection.testRuns.TestRun.id 0.000
12:39:23.380 [print] EID35c4a33b-22bb-4721-bfa1-34e9c0e8d482
* print response.EtfItemCollection.testRuns.TestRun.status 0.000
12:39:23.380 [print] UNDEFINED
* def status = response.EtfItemCollection.testRuns.TestRun.status 0.000
* print status 0.000
12:39:23.381 [print] UNDEFINED
* print response.EtfItemCollection.testRuns.TestRun.label 0.000
12:39:23.381 [print] Conformance Class Download Service - Pre-defined Atom
* print response.EtfItemCollection.ref 0.000
12:39:23.381 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/35c4a33b-22bb-4721-bfa1-34e9c0e8d482.json
* def ref = response.EtfItemCollection.ref 0.000
* print ref 0.011
12:39:23.392 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/35c4a33b-22bb-4721-bfa1-34e9c0e8d482.json
* print response.EtfItemCollection.testRuns.TestRun.logPath 0.000
12:39:23.393 [print] https://inspire.ec.europa.eu/validator//v2/TestRuns/EID35c4a33b-22bb-4721-bfa1-34e9c0e8d482/log
* def embedUrl = 0.000
function(url, hyperlinkText)
     { var html = '<a href=\"' + url + '\" >' + hyperlinkText + '</a>';
     karate.embed(html,'text/html'); }
* def time = java.lang.System.currentTimeMillis() 0.000
* def jsonPath = time + 'Conformance Class Download Service - Pre-defined Atom.json' 0.000
* def responsecontent = response 0.000
* karate.write(responsecontent, jsonPath) 0.002
* def a = embedUrl (ref.substring(0, ref.length - 5) + '.html' , status ) 0.000
* def a = embedUrl ("../../" + jsonPath , status ) 0.000
* def json = get[0] response.EtfItemCollection.referencedItems.testTaskResults 0.000
* def jsonfailedStep = $json.TestTaskResult.testModuleResults.TestModuleResult[*].testCaseResults.TestCaseResult[*].testStepResults.TestStepResult[?(@.status=='FAILED')] 0.000
com.intuit.karate.exception.KarateException: checkdownloadInspireValidator.feature:97 - json string can not be null or empty
* def jsonFailedStepmessages = $jsonfailedStep[*].messages.message.ref 0.000
* def jsonfailedAssert = $jsonfailedStep[*].testAssertionResults.TestAssertionResult[?(@.status=='FAILED')] 0.000
* def jsonfailedMessages = $jsonfailedAssert[*].messages.message 0.000
* def tmpref = $jsonfailedMessages[*].ref 0.000
* def refs = karate.append( jsonFailedStepmessages, tmpref ) 0.000
* def Collections = Java.type('java.util.Collections') 0.000
* copy sortedrefs = refs 0.000
* Collections.sort(sortedrefs) 0.000
* print refs 0.000
* print sortedrefs 0.000
* def tempdir = java.lang.System.getProperty('user.dir') 0.000
* def separator = java.lang.System.getProperty("file.separator") 0.000
* def mystorage = Java.type('storage.DataStorage') 0.000
* def db = new mystorage 0.000
* def LocalDateTime = Java.type('java.time.LocalDateTime') 0.000
* eval db.writeln('- Test: '+ karate.info.scenarioName+ '\n Time: '+ LocalDateTime.now() +'\n title: ' + metadata.title +'\n url: ' + metadata.url + '\n Errors: ' + sortedrefs , db.outputdir()+ separator + 'Inspirevalidator.yaml') 0.000
* def db = db.setfeature(karate.info.featureFileName) 0.000
* def outfile = db.outputdir() + separator + 'Inspirevalidator.csv' 0.000
* db.storeInspireResults(metadata.serviceIdentifierCode, resultmessage, metadata.title, metadata.url, sortedrefs) 0.000